按指定的非排序顺序的第三个列表对列表列表进行排序

时间:2012-04-03 13:29:45

标签: python sorting

我有一个清单:

[['18411971', 'kinase_2', 36], ['75910712', 'unnamed...', 160], ...
  • 约60个条目
  • 每个条目都是一个包含三个值的列表

我想按照另一个列表指定的顺序对第一个值进行排序,该列表按所需顺序排列。

3 个答案:

答案 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]))