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也不太直观。
如果我理解正确,您希望根据您在
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') |
我想你也可以做类似的事情…