关于python:按内部列表索引对两个列表列表进行排序

Sort two lists of lists by index of inner list

本问题已经有最佳答案,请猛点这里访问。

假设我要对列表进行排序,如下所示:

1
2
3
>>>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也不太直观。


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

1
2
3
4
5
6
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']]


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

如果是这样的话,你就只差一步了:

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

它给出:

1
[2, 0, 1]

正如托比亚斯指出的,与

1
map(itemgetter(0),  sorted(enumerate(L), key=lambda x: x[1][2]))


麻木的

设置:

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

解决方案:

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

输出:

1
['c' 'a' 'b']

。只有Python

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

1
2
3
4
5
6
7
>>> 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')

我想你也可以做类似的事情…