2017-01-23 113 views
0

首先,我已經注意到在排序列表中有許多問題發佈在元組中,但是在查看了幾篇文章後,我沒有看到具有這種特定格式的任何問題爲清單。但是,我認爲這應該很簡單。Python - 基於多個排序項的元組排序列表

讓元組的列表是這樣的:

my_list = [(('G', 'J', 'I'), 1.0), (('E', 'H', 'F'), 1.0), (('F', 'H', 'G'), 0.8889), (('I', 'K', 'J'), 0.8889), (('H', 'I', 'G'), 0.8889), (('H', 'J', 'I'), 0.875)] 

注意,列表中的每個元組由1:浮點數:用3個字母,以及2長度爲3的另一個多元組。然後,我的排序目標很簡單:首先通過浮點數排序元組列表,然後通過長度爲3的元組中的第一個字母排序浮點數中的任何關係,第三次打破該字母中的任何關係按長度3元組中的第二個字母排序。那麼所需的輸出將是:

sorted_list = [(('E', 'H', 'F'), 1.0), (('G', 'J', 'I'), 1.0), (('F', 'H', 'G'), 0.8889), (('H', 'I', 'G'), 0.8889), (('I', 'K', 'J'), 0.8889), (('H', 'J', 'I'), 0.875)] 

在這個特殊的例子,2號信函分揀打破第一個字母沒有出現的關係,但它在我的更大的數據集呢。

謝謝!

+1

所以,你想按浮點數降序排列,並按照元組中的字母升序排列?嘗試'key = lambda t:(-t [1],t [0])' –

+0

[Python 3.3使用多個鍵對元組列表排序]可能的重複(http://stackoverflow.com/questions/23454961/python- 3-3-sorting-a-tuple-list-with-multiple-keys) – Prune

回答

2

下面是做這件事:第一排序是反向做的浮動,而領帶是通過在內部的元組排序破:

srt_lst = sorted(my_list, key=lambda (x, y): (-y, x)) #python 2 
print(srt_lst) 
# [(('E', 'H', 'F'), 1.0), (('G', 'J', 'I'), 1.0), (('F', 'H', 'G'), 0.8889), (('H', 'I', 'G'), 0.8889), (('I', 'K', 'J'), 0.8889), (('H', 'J', 'I'), 0.875)] 

在Python 3,你必須索引拉姆達的單個參數來訪問這些項目並將它們用於排序:

srt_lst = sorted(my_list, key=lambda tup: (-tup[1], tup[0])) 
+1

注意:'lambda'中的元組解包在Python 3中不起作用;否則罰款。 –

+0

@tobias_k感謝您的注意。他們的Python 3標記丟失 –

+0

謝謝 - 使用python 2,並且可以確認第一個解決方案爲我正確排序。 – Canovice