2014-05-19 13 views
-3

給定數字元組的列表返回由元組的最後一個元素排序的元組的列表,例如, [(1,2),(3,4,1),(7,5,6,9),(3,)] sort to [(3,4,1),(1,2),(3,),(7,5,6,9)]。請注意,每個元組至少包含一個數字。根據元組中給出的最後一項以降序排列元組

到目前爲止,我有:

def sort_tuples(tuples): 
    result =() 
    for val in tuples: 
     result = insert_tup(val, result) 
    return result 

,但似乎並不奏效。

+1

什麼是'insert_tup'? 'sort_tuples'當然不會嘗試對'tuples'進行排序,所以我不能說我驚訝於它不起作用。 – jonrsharpe

+0

[按第二項(整數值)對元組列表進行排序](http://stackoverflow.com/questions/10695139/sort-a-list-of-tuples-by-2nd-item-integer-value ) – M4rtini

回答

3

使用sorted()一個關鍵參數:

sorted(tuples, key=lambda t: t[-1]) 

你可以使用operator.itemgetter()生成該關鍵功能:

from operator import itemgetter 

sorted(tuples, key=itemgetter(-1)) 

無論採用哪種方式,元組都會在每個元組的最後一個條目上排序,只有。你也可以只扭轉包含元組進行排序倒數第二個值,如果最後的值相等:

sorted(tuples, key=lambda t: t[::-1]) 

演示:

>>> from operator import itemgetter 
>>> tuples = [(1, 2), (3, 4, 1), (7, 5, 6, 9), (3,)] 
>>> sorted(tuples, key=lambda t: t[-1]) 
[(3, 4, 1), (1, 2), (3,), (7, 5, 6, 9)] 
>>> sorted(tuples, key=itemgetter(-1)) 
[(3, 4, 1), (1, 2), (3,), (7, 5, 6, 9)] 
>>> sorted(tuples, key=lambda t: t[::-1]) 
[(3, 4, 1), (1, 2), (3,), (7, 5, 6, 9)] 
>>> different_example = [(3, 4, 1), (1, 2), (3,), (7, 5, 2, 1)] 
>>> sorted(different_example, key=itemgetter(-1)) 
[(3, 4, 1), (7, 5, 2, 1), (1, 2), (3,)] 
>>> sorted(different_example, key=lambda t: t[::-1]) 
[(7, 5, 2, 1), (3, 4, 1), (1, 2), (3,)] 

後者2個示例顯示瞭如何key=itemgetter(-1)key=lambda t: t[::-1]不同;如果最後一個元素相等((3, 4, 1), (7, 5, 2, 1)),則前者將元組保留爲其原始相對順序,後者將使用反向順序中的下一個值來確定順序((7, 5, 2, 1), (3, 4, 1),2排序在4之前)。

+0

我認爲用'[:: - 1]'splice爲每個人創建新數組可能會變得非常緩慢,如果你有大的長元組列表。 – will

+0

@ will:它仍然是O(NlogN)算法;排序的複雜性本身仍然超過了逆轉的固定成本。 * Short * python元組也被緩存用於創建更便宜的對象,所以這不像*你擔心的那樣昂貴*。 –

+0

感謝您的精心解答! :) – user3652397

1

您可以使用sorted函數中的key參數來僅使用元組中的最後一個元素進行比較。

data = [(1, 2), (3, 4, 1), (7, 5, 6, 9), (3,)] 
print sorted(data, key=lambda x: x[-1]) 
# [(3, 4, 1), (1, 2), (3,), (7, 5, 6, 9)] 

如果你喜歡就地排序,那麼你可能想使用list.sort功能,這樣

data.sort(key=lambda x: x[-1]) 
+0

非常感謝你! :) – user3652397

0

它很簡單,只需使用itemgetter函數即可。

from operator import itemgetter 

def sort_tuples(tuples): 
    return sorted(tuples, key=itemgetter(-1)) 

閱讀this howto更多排序選項。

+0

非常感謝你:) – user3652397

相關問題