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

时间:2017-03-22 16:03:07

标签: python list sorting set

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

编辑:The question and accepted answer in this post更为通用,所提供的文件非常深入。我的问题不重复。

3 个答案:

答案 0 :(得分:7)

无论列表中的内容是什么,元素都是&#39; __lt__方法是唯一参考的比较方法。对于集合,a < b表示&#34; ab&#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)

集合是部分排序的,所以

  

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

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

答案 2 :(得分:2)

集合上的__le__运算符定义了部分排序&#34; 子集&#34;。因此,排序顺序未定义。

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

来自Python3 documentaton about sets的引文:

  

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

     

由于sets只定义了部分排序(子集关系),因此未定义list.sort()方法的输出。