2013-10-10 165 views
1

我想排序元組的列表,在元組的第一個元素,使用自定義預定義列表作爲所需的順序。 所以我的列表作爲自定義排序的元組的蟒蛇排序列表

my_list=(['chr1',12],['chrX',32],['chr2',1],['chr1',79],['chr2',6]) 

和第一元件上的預定義列表

custom_list=['chr1','chr2','chrX'] 

我所要的輸出是

(['chr1',12],['chr1',79],['chr2',1],['chr2',6],['chrX',32]) 

(目前,排序在第二個元素是不需要的。) 我無法弄清楚如何做到這一點。任何人都可以幫忙嗎?

+5

你有沒有列表的元組,而不是一個元組列表。 – arshajii

回答

3

可以使用list.index()函數將在custom_list位置變成了一種關鍵:

sorted(my_list, key=lambda x: (custom_list.index(x[0]), x[1])) 

您可能需要把你的custom_list成字典然而,更快的映射:

custom_list_indices = {v: i for i, v in enumerate(custom_list)} 
sorted(my_list, key=lambda x: (custom_list_indices.get(x[0]), x[1])) 

字典查找需要一定的時間,list.index()時間與列表長度成正比。

另一個優點是,對於字典,可以返回字典中未找到的條目的默認值(本例中爲None);相反,list.index()將引發ValueError異常。

演示:

>>> my_list=(['chr1',12],['chrX',32],['chr2',1],['chr1',79],['chr2',6]) 
>>> custom_list=['chr1','chr2','chrX'] 
>>> sorted(my_list, key=lambda x: (custom_list.index(x[0]), x[1])) 
[['chr1', 12], ['chr1', 79], ['chr2', 1], ['chr2', 6], ['chrX', 32]] 
>>> custom_list_indices = {v: i for i, v in enumerate(custom_list)} 
>>> sorted(my_list, key=lambda x: (custom_list_indices.get(x[0]), x[1])) 
[['chr1', 12], ['chr1', 79], ['chr2', 1], ['chr2', 6], ['chrX', 32]] 
+0

非常感謝。怎麼樣的情況下,而不是一個元組列表,我有一個對象列表?我想對custom_list數組上的那個對象的字段進行排序? – user2689782