有一個列表:如何根據另一個列表對列表進行排序?
a = [("ax", 1), ("ec",3), ("bk", 5)]
另一個列表:
b = ["ec", "ax", "bk"]
我想排序根據b
:
sort_it(a, b)
a = [("ec",3), ("ax", 1), ("bk", 5)]
如何做到這一點?
有一個列表:如何根據另一個列表對列表進行排序?
a = [("ax", 1), ("ec",3), ("bk", 5)]
另一個列表:
b = ["ec", "ax", "bk"]
我想排序根據b
:
sort_it(a, b)
a = [("ec",3), ("ax", 1), ("bk", 5)]
如何做到這一點?
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]
另一個posibility是排序a
,根據b
的b
指標進行排序,並根據比對排序的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)的這仍然是可擴展的更大的名單
可能不需要傳統排序。
[tup for lbl in b for tup in a if tup[0] == lbl]
# [('ec', 3), ('ax', 1), ('bk', 5)]
的可能重複的[基於從另一個列表中的值進行排序列表?](http://stackoverflow.com/questions/6618515/sorting-list-based-on-values-from-another-list) – user1251007