我有一个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)方法之外,其他方法都无法正常工作。我想知道是否有任何有效的方法?
答案 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
来引用列表中的元素,并以相同的方式形成排序元组。这与对基础列表进行排序的复杂度相同。