set()函数是最高效的去重方式,底层基于哈希表实现O(1)平均时间复杂度的插入与查找,适用于列表、元组、字符串等可迭代对象,但集合无序且不支持可变类型,需注意空集合写法及嵌套结构限制。

直接用 set() 函数是最高效的方式,它底层基于哈希表,插入和查找都是平均 O(1) 时间复杂度,比遍历列表去重快得多。
核心方法:一行转集合
不管原始数据是列表、元组还是字符串,只要它是可迭代对象,就能直接传给 set():
-
set([1, 2, 2, 3])→{1, 2, 3} -
set((4, 5, 5, 6))→{4, 5, 6} -
set("hello")→{'h', 'e', 'l', 'o'}(注意:字符级去重)
注意顺序与重复逻辑
集合天然无序且自动去重,这既是优势也是限制:
- 如果你只关心“是否存在”,比如查重、成员判断、两数之和中的已见元素缓存,集合非常合适;
- 但若需保留原始顺序(如去重后仍按首次出现顺序排列),不能只靠
set(),得配合dict.fromkeys()或手动去重; - 数字 12345 转集合不是得到 {12345},而是先转字符串再拆成字符集:
set(str(12345))→{'1','2','3','4','5'}。
避免常见陷阱
几个容易出错的点要留心:
- 空集合必须写成
set(),而不是{}(那是空字典); - 集合里不能放列表、字典等可变类型,否则会报
TypeError; - 如果原始数据含嵌套结构(如列表中包含字典),
set()会失败,需先做序列化或改用其他策略; - 单纯转换不等于完成任务——后续要用集合做交集、差集等运算时,记得用
.intersection()、.difference()等方法,别误用in判断整个子结构。
性能对比很直观
处理一万个元素时:
- 用
list查找某值:平均要检查 5000 次; - 用
set查找同一值:基本 1 次哈希就能定位; - 去重操作本身,
set()是 O(n),而手写循环去重是 O(n²)。


















