排序列表列表,创建具有索引值的另一个映射列表

时间:2018-02-17 20:07:04

标签: python list sorting indexing

所以我有一个列表的原始列表 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 和其他列表进行排序映射以包含原始元素的索引。 在循环中处理数据时,我希望能够(当我需要时)从 srt 通过 idx 获取某些元素,如: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]]

P.S。 atm我将排序后的索引作为循环执行:

#...
srt.sort()
map = range(len)
for x in range(len):
    map[srt[x][2]]=x #for 2-number lists where idx at [2]

所以这是非常低效的,这就是我的问题的原因 - 我的意思是它确实可以在排序时创建映射结构,而我只是不知道怎么样我&# 39;我是Python的新手......

P.P.S。如果你想知道为什么我想要这样奇怪的行为 - 它与3D网格处理有关,所以我真的需要保持原始点值+多边形数据,同时操纵投影[2]坐标和/或谨慎(近似)的重复点数组[3]原始点的坐标值。沿着轴/向量循环它们,而有时仍然根据多边形边连接通过索引获得一些点。所以我真的需要那种数据布局。

1 个答案:

答案 0 :(得分:0)

这可能正是您所寻找的,但确保需要一个具有预期输出的完整工作示例。

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]