【发布时间】:2018-07-28 11:08:46
【问题描述】:
所以我有一个原始列表列表oList,子列表是数字序列。我创建了另一个列表 srt 来像这样操作数据:
#...
srt = []
for i in range(len(oList)):
srt.append([ int(oList[i][0]), int(oList[i][2]), i ])
所以 srt 的每个元素都是 [n0,n2,idx] (或类似的东西,要点是我将 oList 中的原始元素的索引保留为最后一个元素)...
现在我想通过(n0,n2...ni) 对它进行排序,并将索引作为 idx 的另一个映射列表的创建。 srt.sort() 第一部分做得很好,但手动生成映射对我来说似乎效率低下。
所以我希望 srt 按 n0、n1 ... ni 和另一个列表排序map 包含原始元素的索引。
在循环处理数据时,我希望能够(当我需要时)通过 idx 从 srt 获取一些元素:something = srt[map[idx]][0]
例子:
# srt=[ [12,8,0], [-4,4,1], [-4,-2,2], [6,8,3], ]
map, srt = custom_sort_here(srt)
# srt=[ [-4,-2,2], [-4,4,1], [6,8,3], [12,8,0], ]
# map=[ 3, 1, 0, 2, ]
# here i can get element with idx=2 from srt like:
el = srt[map[2]]
附: atm 我在排序后作为循环执行了索引:
#...
srt.sort()
map = range(len)
for x in range(len):
map[srt[x][2]]=x #for 2-number lists where idx at [2]
所以它非常低效,这就是我提出问题的原因 - 我的意思是在排序时创建映射结构绝对是可能的,我只是不知道我对 Python 有多陌生...
P.P.S.如果你想知道为什么我想要这种奇怪的行为 - 它与 3D 网格处理有关,所以我真的需要在处理投影 [2] 坐标和/或谨慎(近似)的重复点数组时保留原始点值 + 多边形数据[3]原点坐标值。沿着轴/向量循环通过它们,同时有时仍然根据多边形边缘连接通过索引获得一些点。所以我真的需要那种数据布局。
【问题讨论】:
-
-是不是非常低效?您正在以 C 的速度进行艰苦的工作,即 O(nlogn) 部分。然后你以 CPython (?) 的速度得到一个 O(n) 部分。您可以在 stromberg.dnsalias.org/~strombrg/sort-comparison 修改其中一种,以更改索引和交换的完成方式(以 CPython 速度),以消除 O(n) 步骤(在 O(nlogn) 时间内进行排序,但以 CPython 速度) 但你可能会发现你已经拥有的东西会更好。请记住,虽然有点复杂,但 Timsort 通常“超自然地快速”且稳定。
-
好点,只是我想优化一切,因为其他部分已经相当复杂 =)) 至于 CPython - 我不确定它是如何工作的,它是一个 python 插件对于我工作的 Cinema4D。它肯定会被编译,但我不知道它是字节码还是纯二进制......
标签: python list sorting indexing