2013-10-10 123 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