【问题标题】:Python -- efficient way to obtain index of elements in sorted list, sorted with multiple attributesPython——获取排序列表中元素索引的有效方法,使用多个属性排序
【发布时间】:2019-01-23 23:51:05
【问题描述】:

我有一个 xyz 坐标列表,格式如下:

mycrds = [[0.0, 0.5, 0.1],
          [0.4, 0.6, 0.8],
          [0.2, 0.3, 0.9], ...]

我知道如果我想得到排序后的列表,首先按z排序,其次按y排序,最后按x排序,我需要这样做:

sorted(mycrds, key=lambda x: [x[2], x[1], x[0]])

但是如何获取排序列表中每个坐标的原始索引列表?到目前为止,我已经尝试了how to return index of a sorted list? 中描述的所有方法,但是除了 O(N^2) 方法之外,它们都没有很好的效果。我想知道是否有任何有效的方法可以做到这一点?

【问题讨论】:

    标签: python list sorting indexing


    【解决方案1】:
    l2 = list(enumerate(mycrds))
    sorted(l2, key=lambda x: [x[1][2], x[1][1], x[1][0]])
    print(l2)
    

    枚举将保留数组的原始坐标。

    【讨论】:

    • 这样就可以了。如果您希望将键作为一个单独的数组:list(map(lambda x: x[0], sorted(enumerate(mycrds), key=lambda x: [x[1][2], x[1][1], x[1][0]]))) 可能会有所帮助。
    【解决方案2】:

    给定:

    mycrds = [[0.0, 0.5, 0.9],
              [0.4, 0.6, 0.8],
              [0.2, 0.3, 0.1]]
    

    如果这给了你想要的排序顺序:

    >>> sorted(mycrds, key=lambda sl: (sl[2],sl[1],sl[0]))
    [[0.2, 0.3, 0.1], [0.4, 0.6, 0.8], [0.0, 0.5, 0.9]]
    

    然后你可以像这样获取每个列表项的原始索引:

    >>> sorted(range(len(mycrds)), key=lambda i: (mycrds[i][2],mycrds[i][1],mycrds[i][0]))
    [2, 1, 0]
    

    所以你所做的就是对0..len(your_list) 中的一个范围进行排序,并使用该索引i 来引用列表中的元素并以相同的方式形成排序元组。这将与对基础列表进行排序具有相同的复杂性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多