[英]How does Python sort a list of sets?
不管列表中有什么,元素的__lt__
方法是唯一参考的比较方法。 对于集合, a < b
表示“ a
是b
子集”,这不足以定义全序。 这就是为什么结果通常是未定义的。 它可以是原始列表的任何排列,与实现恰好将__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}
。 所以结果根本没有定义。
__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.