2013-02-28 41 views
5

我有列表my_list例如列表my_list例如,Python排序列表在多個級別上,並與自定義訂單

[ 
['item 3.1', 'item 3.2', 'item 3.3', 'item 3.4', 'item 3.5'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.2', 'item 3.2'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.6', 'item 3.2'], 
['item 3.1', 'item 2.2', 'item 2.4', 'item 2.7', 'item 2.5'], 
['item 2.1', 'item 2.2', 'item 2.3', 'item 2.4', 'item 2.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.4', 'item 1.5'], 
['item 4.1', 'item 4.2', 'item 4.3', 'item 4.4', 'item 4.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.5', 'item 1.5'] 
] 

我要訂購多層次的這份名單與水平的1是一個客戶訂單,但不知道如何做到這一點。

例如我想先訂購第一件,然後在訂單內訂購,然後在第三件訂購,然後在訂單內訂購,第四件訂購。但我想的第一個項目被責令/排序在這個特定的順序,而不是按字母順序排列:

item 4.1 
item 2.1 
item 3.1 
item 1.1 

所以最終名單(排序後)將是:

[ 
['item 4.1', 'item 4.2', 'item 4.3', 'item 4.4', 'item 4.5'] 
['item 2.1', 'item 2.2', 'item 2.3', 'item 2.4', 'item 2.5'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.2', 'item 3.2'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.6', 'item 3.2'], 
['item 3.1', 'item 3.2', 'item 3.3', 'item 3.4', 'item 3.5'], 
['item 3.1', 'item 2.2', 'item 2.4', 'item 2.7', 'item 2.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.4', 'item 1.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.5', 'item 1.5'], 
] 

我知道我可以排序了多層次做:

s = sorted(my_list, key=itemgetter(0,2,3)) 

但這會按字母順序排序所有這些,我不知道該怎麼辦設置的首列由自定義排序。

+0

該具體項目順序的來源是什麼?它是一個項目清單?這是一個映射嗎? – 2013-02-28 14:48:04

+0

'key = map(d .__ getitem__,itemgetter(0,2,3)(my_list))'哪裏'd = {4.1:0,2.1:1,3.1:2,1.1:3}''怎麼樣? 因爲和我一樣睡眠不足,所以我不想讓我的第三個錯誤發生在這一天,但是如果任何人都能看到使用它的方法,請做 – inspectorG4dget 2013-02-28 14:51:52

+0

該列表來自db查詢並且是項目列表。他們回來的順序,他們被添加到數據庫 – John 2013-02-28 14:52:47

回答

4

醜陋和低效,但可能工作:

order = ['item 4.1', 'item 2.1', 'item 3.1', 'item 1.1'] 
my_list.sort(key=lambda x: order.index(x[0])) 

重新排序my_list到:

[['item 4.1', 'item 4.2', 'item 4.3', 'item 4.4', 'item 4.5'], 
['item 2.1', 'item 2.2', 'item 2.3', 'item 2.4', 'item 2.5'], 
['item 3.1', 'item 3.2', 'item 3.3', 'item 3.4', 'item 3.5'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.2', 'item 3.2'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.6', 'item 3.2'], 
['item 3.1', 'item 2.2', 'item 2.4', 'item 2.7', 'item 2.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.4', 'item 1.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.5', 'item 1.5']] 

如果你想第一欄自定義的方式進行排序,再由第三和第四字母,只需展開key

my_list.sort(key=lambda x: (order.index(x[0]), x[2], x[3])) 

返回

[['item 4.1', 'item 4.2', 'item 4.3', 'item 4.4', 'item 4.5'], 
['item 2.1', 'item 2.2', 'item 2.3', 'item 2.4', 'item 2.5'], 
['item 3.1', 'item 2.2', 'item 2.4', 'item 2.7', 'item 2.5'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.2', 'item 3.2'], 
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.6', 'item 3.2'], 
['item 3.1', 'item 3.2', 'item 3.3', 'item 3.4', 'item 3.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.4', 'item 1.5'], 
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.5', 'item 1.5']] 
+0

感謝這一點,但是這似乎沒有做內部訂單,因爲項目3.1的順序,然後不是索引3和4訂購 – John 2013-02-28 14:58:10

+0

剛剛看到編輯謝謝 – John 2013-02-28 15:23:02