簡體   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