2012-10-10 245 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)] 
相關問題