Python集合不可排序、无序且元素必须可哈希;比较依赖__eq__和__hash__,自定义类需同步实现二者;sorted()返回新列表,元素须可比较;集合间支持子集、相等性比较;避免误用.sort(),有序去重推荐dict.fromkeys()。
Python中对象的比较和排序依赖于内置的比较逻辑,而集合(set)本身是无序、不重复的容器,不支持索引、切片或直接排序,也不能包含可变对象。理解其底层规则,才能正确使用比较、转换与排序操作。
集合判断两个元素是否相等,依据是 __eq__ 方法;能否加入集合,则取决于是否可哈希——即实现了 __hash__ 且满足“相等对象必须有相同哈希值”的约定。
int、str、tuple)默认可哈希,可直接用于集合__hash__ 和 __eq__,且逻辑一致(例如:若 a == b 为真,则 hash(a) == hash(b) 必须为真)list、dict、set 等可变类型不可哈希,不能作为集合元素,否则抛出 TypeError
集合无顺序概念,调用 sorted() 实际是对它的迭代结果(即元素序列)排序,返回的是新列表,不是原集合改变。
sorted({3, 1, 4}) → [1, 3, 4](升序,元素需支持比较){1, "a"}),sorted() 会报 TypeError:无法比较 int 和 str
key 参数定制排序逻辑,例如按绝对值:sorted({-3, 1, -2}, key=abs) → [1, -2, -3]
集合支持数学意义上的包含关系比较,不依赖元素顺序:
a 表示 a 是 b 的子集(含相等);a 表示真子集a >= b 表示超集;a == b 判断元素完全相同(自动忽略顺序和重复)a == b 不等价于 id(a) == id(b),而是逐个元素比对成员关系实际编码中容易混淆集合与列表/元组的行为:
.sort()(该方法只属于列表)→ 报 AttributeError
list(set(...)) 去重后假设顺序不变 → 实际顺序由哈希分布决定,Python 3.7+ 虽保持插入顺序,但集合本身不保证dict.fromkeys(iterable)(保留首次出现顺序),再转 list
sorted(set(data)),但务必确保元素类型兼容比较