[英]sorting a list of tuples in Python
在處理來自Google Python類的問題時,我通過使用來自Stack overflow的2-3個示例來制定以下結果 -
def sort_last(tuples):
return [b for a,b in sorted((tup[1], tup) for tup in tuples)]
print sort_last([(1, 3), (3, 2), (2, 1)])
我昨天學習了List理解,所以對列表理解有所了解,但我很困惑這個解決方案是如何整體工作的。 請幫我理解這個(功能第2行)。
這種模式稱為decorate-sort-undecorate。
(1, 3)
轉換為(3, (1, 3))
,將每個tuple
包裝在一個新元組中,並使用您要先排序的項目。 tuple
排序,確保原始tuple
中的第二個項目首先排序。 (3, (1, 3))
從(3, (1, 3))
到(1, 3)
。 在Python中,顯式裝飾幾乎總是不必要的。 相反,使用sorted
的key
參數 :
sorted(list_of_tuples, key=lambda tup: tup[1]) # or key=operator.itemgetter(1)
或者,如果你想對tuple
的反轉版本進行排序,無論它的長度如何:
sorted(list_of_tuples, key=lambda tup: tup[::-1])
# or key=operator.itemgetter(slice(None, None, -1))
讓我們分解一下:
在: [(tup[1],tup) for tup in tuples]
出: [(3, (1, 3)), (2, (3, 2)), (1, (2, 1))]
所以我們剛剛創建了新元組,其第一個值是內元組的最后一個值 - 這樣它就會按'元組'中每個元組的第二個值排序。
現在我們對返回的列表進行排序
在: sorted([(3, (1, 3)), (2, (3, 2)), (1, (2, 1))])
出: [(1, (2, 1)), (2, (3, 2)), (3, (1, 3))]
所以我們現在按照每個元組的第二個值排序我們的列表。 剩下的就是提取原始元組,這是通過從for循環中僅取b來完成的。
列表推導迭代給定列表(在這種情況下sorted([...]
)並按順序返回提取的值。
您的示例的工作原理是創建一個新列表,其中索引為1
的元素后跟列表中每個元組的原始元組。 例如。 (3,(1,3))
為第一個元素。 排序函數按索引0
開始按每個元素排序,因此列表按第二項排序。 然后該函數遍歷新列表中的每個項目,並返回原始元組。
另一種方法是使用sorted函數中的key
參數,該參數根據key
的值進行排序。 在這種情況下,您希望key
是索引1
處每個元組中的項。
>>> from operator import itemgetter
>>> sorted([(1, 3), (3, 2), (2, 1)],key=itemgetter(1))
請參考接受的答案.. +這里是一個更好的可視化的例子,
key
是一個函數,它將被調用以轉換集合的項目以進行比較..就像Java中的compareTo
方法一樣。
傳遞給key的參數必須是可調用的。 這里, lambda
的使用創建了一個匿名函數(可以調用)。
lambda的語法是單詞lambda,后跟可迭代的名稱,然后是單個代碼塊。
下面的例子中,我們正在排序一個元組列表,它包含某個事件和演員名稱的信息時間。
我們按事件發生的時間對此列表進行排序 - 這是元組的第0個元素。
為Ready Player One粉絲大喊大叫! =)
>>> gunters = [('2044-04-05', 'parzival'), ('2044-04-07', 'aech'), ('2044-04-06', 'art3mis')]
>>> gunters.sort(key=lambda tup: tup[0])
>>> print gunters
[('2044-04-05', 'parzival'), ('2044-04-06', 'art3mis'), ('2044-04-07', 'aech')]
注 - s.sort([cmp[, key[, reverse]]])
對s的項目進行排序
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.