Python按顺序查看元组的元素,对元组列表进行排序。由于集合是无序的,因此Python如何对集合列表进行排序?
编辑:The question and accepted answer in this post更为通用,所提供的文件非常深入。我的问题不重复。
答案 0 :(得分:7)
无论列表中的内容是什么,元素都是' __lt__
方法是唯一参考的比较方法。对于集合,a < b
表示&#34; a
是b
&#34;的正确子集,不足以定义总订单。这就是为什么结果通常是未定义的。它可以是原始列表的任何排列,与实现恰好应用于__lt__
的哪些列表元素对一致。
如果对于列表中的每对集合,其中一个实际上是另一对的适当子集,则列表将从最小(基数)集合排序到最大。否则很少可以说。例如:
>>> sorted([{5, 6}, {3, 4}, {5}, {3}]) # nothing changes
[{5, 6}, {3, 4}, {5}, {3}]
发生的情况是未定义的实现细节的结果。自从我写list.sort()
以来,我知道在这种情况下会发生什么,但不能保证总是以这种方式工作:
首先,实施要求&#34;是{3, 4} < {5, 6}
?&#34;。不,所以前两个元素的顺序与已经排序一致。它接下来要求&#34;是{5} < {3, 4}
?&#34;。不,所以前三个元素似乎已经排序了。最后,它问{34}是{3} < {5}
?&#34;。没有了,所以原始列表的整个顺序与已经排序的一致,没有任何变化。
未来的实施可以例如询问&#34;是{5} < {5, 6}
?&#34;在某些时候,因为&#34;是&#34;决定{5}
需要在{5, 6}
之前出现。所以结果根本没有定义。
答案 1 :(得分:2)
答案 2 :(得分:2)
集合上的__le__
运算符定义了部分排序&#34; 子集&#34;。因此,排序顺序未定义。
{3} < {5}
是错误的,但{5} < {3}
也是如此,因此排序算法通常不会重新排列它们。
来自Python3 documentaton about sets的引文:
子集和相等比较不会推广到总排序函数。例如,任何两个非空的不相交集都不相等,并且不是彼此的子集,因此以下所有都返回False:
a<b, a==b, or a>b
。由于sets只定义了部分排序(子集关系),因此未定义list.sort()方法的输出。