Python-获取排序列表中元素索引的有效方法,该列表具有多个属性

时间:2018-08-17 00:17:04

标签: python list sorting indexing

我有一个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)方法之外,其他方法都无法正常工作。我想知道是否有任何有效的方法?

2 个答案:

答案 0 :(得分:1)

[xr-vm_node0_RP0_CPU0:~]$ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=9.06 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=114 time=8.47 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=114 time=7.36 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=114 time=24.4 ms
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3007ms
rtt min/avg/max/mdev = 7.369/12.332/24.415/7.003 ms

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

答案 1 :(得分:0)

给出:

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来引用列表中的元素,并以相同的方式形成排序元组。这与对基础列表进行排序的复杂度相同。