簡體   English   中英

在Python中排序元組列表

[英]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. 您將每個(1, 3)轉換為(3, (1, 3)) ,將每個tuple包裝在一個新元組中,並使用您要先排序的項目。
  2. 您可以使用外部tuple排序,確保原始tuple中的第二個項目首先排序。
  3. 在保持列表順序的同時(3, (1, 3))(3, (1, 3))(1, 3)

在Python中,顯式裝飾幾乎總是不必要的。 相反,使用sortedkey參數

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM