按内部列表索引对两个列表列表进行排序

时间:2017-08-22 09:09:46

标签: python list sorting numpy

假设我想对列出的列表进行排序,如解释here

>>>L=[[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>>sorted(L, key=itemgetter(2))
[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

(或者使用lambda。)现在我有第二个列表,我想按相同的顺序排序,所以我需要索引的新顺序。 sorted()或.sort()不返回索引。我怎样才能做到这一点?

实际上在我的情况下,两个列表都包含 numpy数组。但对于那种情况,numpy sort / argsort也不直观。

3 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望根据您在B上应用的排序规则,在下面的示例中订购L。看看这个:

L = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
B = ['a', 'b', 'c']

result = [i for _, i in sorted(zip(L, B), key=lambda x: x[0][2])]
print(result)  # ['c', 'a', 'b']
# that corresponds to [[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

答案 1 :(得分:1)

如果我理解正确,您想知道列表是如何重新排列的。即排序后的第0个元素,等等。

如果是这样,你就是一步之遥:

L2 = [L.index(x) for x in sorted(L, key=itemgetter(2))]

给出:

[2, 0, 1]

正如托比亚斯指出的那样,与

相比,这是不必要的复杂
map(itemgetter(0),  sorted(enumerate(L), key=lambda x: x[1][2]))

答案 2 :(得分:0)

NumPy的

设定:

import numpy as np
L = np.array([[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']])
S = np.array(['a', 'b', 'c'])

解决方案:

print S[L[:,2].argsort()]

输出:

['c' 'a' 'b']

Just Python

您可以组合两个列表,将它们排序在一起,然后再将它们分开。

>>> L = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> S = ['a', 'b', 'c']
>>> L, S = zip(*sorted(zip(L, S), key=lambda x: x[0][2]))
>>> L
([9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't'])
>>> S
('c', 'a', 'b')

我猜你也可以在NumPy中做类似的事情......