【问题标题】:Sort two lists of lists by index of inner list [duplicate]按内部列表的索引对两个列表列表进行排序[重复]
【发布时间】:2018-01-30 11:45:48
【问题描述】:

假设我想像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 排序/argsort 也不直观。

【问题讨论】:

  • 想要的输出最终是什么?
  • 我想说第一步是给我们一个完整的例子。我没有看到第二个列表。我也没有看到 numpy。
  • 那么根据第一个list 上执行的移位,订购第二个?如果是,请在订购前zip 他们。
  • 您能否显示您的第二个列表和预期的输出,以使这一点更清楚?如果你的第二个列表是[1,2,3],你想把它排序为[3,1,2],对吧?

标签: python list sorting numpy


【解决方案1】:

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

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']]

【讨论】:

    【解决方案2】:

    如果我理解正确,您想知道列表是如何重新排列的。即排序后的第 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]))
    

    【讨论】:

    • 对于更长的列表,这是非常浪费的,具有 O(n²) 复杂度。更好地使用sorted(enumerate(...))
    【解决方案3】:

    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']
    

    只是 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 中做类似的事情......

    【讨论】:

      猜你喜欢
      • 2016-09-10
      • 2011-05-09
      • 2016-08-30
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      相关资源
      最近更新 更多