[英]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.