繁体   English   中英

Python 如何对集合列表进行排序?

[英]How does Python sort a list of sets?

Python 通过按顺序查看元组的元素来对元组列表进行排序。 由于集合是无序的,Python 是如何对集合列表进行排序的?

编辑: 这篇文章的问题和接受的答案更笼统,给出的文件非常深入。 我的问题不是重复的。

不管列表中有什么,元素的__lt__方法是唯一参考的比较方法。 对于集合, a < b表示“ ab子集”,这不足以定义全序。 这就是为什么结果通常是未定义的。 它可以是原始列表的任何排列,与实现恰好将__lt__应用到的列表元素对一致。

如果对于列表中的每一对集合,一个实际上是另一个集合的真子集,那么列表将从最小(基数)集合到最大排序。 否则就无话可说了。 例如:

>>> sorted([{5, 6}, {3, 4}, {5}, {3}])  # nothing changes
[{5, 6}, {3, 4}, {5}, {3}]

发生的事情是未定义的实现细节的结果。 自从我写了list.sort() ,我知道在这种情况下会发生什么,但不能保证总是这样工作:

首先,实现会询问“是{3, 4} < {5, 6}吗?”。 不,所以前两个元素的顺序与已经排序是一致的。 它接下来询问“是{5} < {3, 4}吗?”。 不,所以前三个元素似乎已经排序。 最后它问“是{3} < {5}吗?”。 再次没有,所以原始列表的整个顺序与已经排序的一致,没有任何变化。

例如,未来的实现可能会问“是{5} < {5, 6}吗?” 在某些时候,因为“是”决定{5}需要出现在{5, 6} 所以结果根本没有定义。

集合是部分有序的,所以

list.sort() 方法的输出对于集合列表是未定义的。

https://docs.python.org/3/library/stdtypes.html#set

__le__上的__le__运算符定义了偏序“子集”。 因此排序顺序是未定义的。

{3} < {5}是假的,但{5} < {3} {3} < {5}也是假的,因此排序算法通常不会重新排列它们。

来自Python3 文档中关于集合的引用:

子集和相等比较不能推广到总排序函数。 例如,任何两个非空不相交集不相等,也不是彼此的子集,因此以下所有返回 False: a<b, a==b, or a>b

由于集合仅定义部分排序(子集关系),因此 list.sort() 方法的输出对于集合列表是未定义的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM