我有一个清单:
[['18411971', 'kinase_2', 36], ['75910712', 'unnamed...', 160], ...
我想按照另一个列表指定的顺序对第一个值进行排序,该列表按所需顺序排列。
答案 0 :(得分:3)
通常的习惯用法是使用密钥进行排序:
>>> a = [[1,2],[2,10,10],[3,4,'fred']]
>>> b = [2,1,3]
>>> sorted(a,key=lambda x: b.index(x[0]))
[[2, 10, 10], [1, 2], [3, 4, 'fred']]
这可能会出现性能问题 - 如果密钥是可清除的,那么对于长列表来说这可能会更快:
>>> order_dict = dict(zip(b, range(len(b))))
>>> sorted(a,key=lambda x: order_dict[x[0]])
[[2, 10, 10], [1, 2], [3, 4, 'fred']]
答案 1 :(得分:2)
怎么样:
inputlist = [['18411971', 'kinase_2', 36], ['75910712', 'unnamed...', 160], ... # obviously not valid syntax
auxinput = aux = ['75910712', '18411971', ...] # ditto
keyed = { sublist[0]:sublist for sublist in inputlist }
result = [keyed[item] for item in auxinput]
此处无需使用排序。对于大型列表,这会更快,因为它是O(n)
而不是O(n * log n)
。
如果密钥不是唯一的,可以使用有序字典的某些变体(例如,根据Niklas B的建议defaultdict(list)
)来构建密钥表示。
答案 2 :(得分:0)
所以,如果我理解你的话,你就有了样本输入列表:
a = [['18411971', 'kinase_2', 36], ['75910712', 'unnamed...', 160], ...
并且您希望使用额外的列表对此进行排序,该列表提到了子列表的第一个元素在输出中出现的顺序:
aux = ['75910712', '18411971', ...]
如果这是对的,我认为可以使用以下内容实现结果:
sorted(a, key = lambda x: aux.index(x[0]))