在 Python 中,集合(`set`)是一种**无序、不重复、可变**(但 `frozenset` 是不可变的)的数据类型
在 Python 中集合set是一种无序、不重复、可变但frozenset是不可变的的数据类型用于存储唯一元素支持数学上的集合运算如并集、交集、差集、对称差集等。✅ 常用特性元素必须是不可变类型如int,str,tuple不能包含list、dict或set等可变类型创建方式{1, 2, 3}或set([1, 2, 3])空集合只能用set()不能用{}因为{}表示空字典常用方法add(x)添加单个元素update(iterable)批量添加类似extendremove(x)/discard(x)删除元素remove不存在时报错discard安静忽略pop()随机移除并返回一个元素集合无序无索引clear()清空集合。 常用集合运算操作符 方法运算操作符对应方法说明并集ABA.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(AB)# {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_lstlist(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记录已见元素适合需自定义逻辑的场景seenset()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]也不能认为它“有序”——这纯属巧合违反可移植性与可维护性原则。