2012-10-10 186 views
28

有一个列表:如何根据另一个列表对列表进行排序?

a = [("ax", 1), ("ec",3), ("bk", 5)] 

另一个列表:

b = ["ec", "ax", "bk"] 

我想排序根据b

sort_it(a, b) 

a = [("ec",3), ("ax", 1), ("bk", 5)] 

如何做到这一点?

+2

的可能重复的[基于从另一个列表中的值进行排序列表?](http://stackoverflow.com/questions/6618515/sorting-list-based-on-values-from-another-list) – user1251007

回答

47
a.sort(key=lambda x: b.index(x[0])) 

这在从a作为它的值排序的每个元组的第一个元素的b利用索引进行排序就地a

另一个,可能更清洁,写作的方式,它是:

a.sort(key=lambda (x,y): b.index(x)) 

如果您有大量项目,这可能是更有效地做事情有点不同,因为.index()可一个长长的清单上昂贵的操作,你实际上并不需要做一个全面的排序,因为你已经知道的顺序:

mapping = dict(a) 
a[:] = [(x,mapping[x]) for x in b] 

注意,这将仅适用于工作2元组列表。如果你想让它为任意长度元组的工作,你需要稍微修改:

mapping = dict((x[0], x[1:]) for x in a) 
a[:] = [(x,) + mapping[x] for x in b] 
1

另一个posibility是排序a,根据bb指标进行排序,并根据比对排序的a指数

a.sort(key=lambda x: x[0]) 
ind = [i[0] for i in sorted(enumerate(b),key=lambda x: x[1])] 
a = [i[0] for i in sorted(zip(a,ind),key=lambda x: x[1])] 

,因为每一个排序需要的n * log(n)的这仍然是可扩展的更大的名单

可能不需要
0

传统排序。

[tup for lbl in b for tup in a if tup[0] == lbl] 
# [('ec', 3), ('ax', 1), ('bk', 5)] 
相关问题