在 Python 中,集合(`set`)是一种**无序、不重复、可变**(但 `frozenset` 是不可变的)的数据类型
2026/6/18 16:51:40 网站建设 项目流程

在 Python 中,集合(set)是一种无序、不重复、可变(但frozenset是不可变的)的数据类型,用于存储唯一元素,支持数学上的集合运算(如并集、交集、差集、对称差集等)。

✅ 常用特性:

  • 元素必须是不可变类型(如int,str,tuple),不能包含listdictset等可变类型;
  • 创建方式:{1, 2, 3}set([1, 2, 3])(空集合只能用set(),不能用{},因为{}表示空字典);
  • 常用方法:
    • add(x):添加单个元素;
    • update(iterable):批量添加(类似extend);
    • remove(x)/discard(x):删除元素(remove不存在时报错,discard安静忽略);
    • pop():随机移除并返回一个元素(集合无序,无索引);
    • clear():清空集合。

🧮 常用集合运算(操作符 & 方法):

运算操作符对应方法说明
并集`AB`A.union(B)
交集A & BA.intersection(B)共同元素
差集A - BA.difference(B)A中有、B中没有的元素
对称差集A ^ BA.symmetric_difference(B)仅在 A 或 B 中出现一次的元素

📌 示例:

A={1,2,3}B={3,4,5}print(A|B)# {1, 2, 3, 4, 5}print(A&B)# {3}print(A-B)# {1, 2}print(A^B)# {1, 2, 4, 5}

⚠️ 注意:集合不支持索引、切片或键访问(如s[0]s['key']会报错TypeError)。
在 Python 中,将列表去重并保持原始顺序的推荐方法(尤其在 Python 3.7+)是使用dict.fromkeys()

lst=[3,1,4,1,5,9,2,6,5]unique_lst=list(dict.fromkeys(lst))print(unique_lst)# [3, 1, 4, 5, 9, 2, 6]

✅ 原理:dict.fromkeys(iterable)会以iterable中每个元素为键、None为值创建字典;由于Python 3.7+ 字典保持插入顺序,且键唯一,因此天然实现“去重 + 保序”。

其他可行方法:

  • 使用collections.OrderedDict.fromkeys(lst)(兼容旧版 Python,但 3.7+ 已非必需);
  • 手动遍历 +set记录已见元素(适合需自定义逻辑的场景):
    seen=set()unique_lst=[]forxinlst:ifxnotinseen:seen.add(x)unique_lst.append(x)

❌ 为什么list(set(lst))不能保证顺序
因为set无序数据结构(底层基于哈希表,元素存储位置取决于哈希值和内部扩容策略),其迭代顺序不保证与插入顺序一致,且在不同 Python 版本、甚至同一版本不同运行中都可能变化(尽管 CPython 3.7+ 因哈希随机化默认启用,实际顺序常看似“稳定”,但这是实现细节,非语言保证)。因此list(set(lst))的结果顺序是未定义的(undefined behavior),不可依赖。

⚠️ 补充:即使某次运行输出[1, 2, 3],也不能认为它“有序”——这纯属巧合,违反可移植性与可维护性原则。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询