如何根据另一个列表对列表进行排序?
问题描述:
有一个列表:如何根据另一个列表对列表进行排序?
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