假设我想对列出的列表进行排序,如解释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也不直观。
答案 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)
设定:
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']
您可以组合两个列表,将它们排序在一起,然后再将它们分开。
>>> 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中做类似的事情......