【问题标题】:Sort list of lists creating another mapping list with index values排序列表创建另一个具有索引值的映射列表
【发布时间】: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 和另一个列表排序ma​​p 包含原始元素的索引。 在循环处理数据时,我希望能够(当我需要时)通过 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


【解决方案1】:

这可能是您正在寻找的内容,但可以肯定的是,需要一个具有预期输出的完整示例。

srt= [ [12,8,0], [-4,4,1], [-4,-2,2], [6,8,3] ]

srt_enum = dict(sorted(enumerate(srt), key=lambda x: x[1]))

# {2: [-4, -2, 2], 1: [-4, 4, 1], 3: [6, 8, 3], 0: [12, 8, 0]}

srt_enum_lst = sorted(srt_enum.items(), key=lambda x: x[1])

# [(2, [-4, -2, 2]), (1, [-4, 4, 1]), (3, [6, 8, 3]), (0, [12, 8, 0])]

srt_enum[2]

# [-4, -2, 2]

【讨论】:

  • 嗯,它有效,但它不是索引。这种方法有一个dict结构+带有重复数据的列表结构+列表也有过多的额外层次结构和重复索引。我更喜欢我的手动索引,即使它是无效的,因为在排序后执行,我猜它是以非 Python 方式完成的,因为我是 Python 中的新手......
  • @Markus_13,如果这些任务的性能很差,请考虑使用 Cyton 或仅使用普通 C 来定制结构。但首先我要确认这确实是您的应用程序的瓶颈。
  • 好吧,正如我在对主帖的评论中所说:我想优化一切,因为其他部分已经相当复杂 =)) 显然这不是瓶颈,但问题是 - 我只是可以'T 简化或优化网格处理部分,所以我想尽我所能优化其他一切。 + 也是出于学习目的,因为我学习 Python,我不敢相信在排序时没有办法动态创建索引结构......
猜你喜欢
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多