使用枚举和排序创建新列表

时间:2016-06-24 00:04:14

标签: python

我是python和编码的新手。我其实是一位Cinema 4D艺术家。 C4D有一个内置的python脚本管理器。我会尽力解释我正在努力的目标。

我有一个球体。球体被分解成点。我已经计算出球体上每个点远离不同物体的距离。我列出了所有这些计算出的距离。我想创建一个新的索引数组和相应的距离计算。如何将两个列表组合成一个新数组?下面的模拟示例 -

preweight = [(0,150.2)(1,2.3)(2,5.5)(3,145.2)(4,30.4)(5,22)]

返回所需的正确索引数[0,1,2,3,4,5] 我想要的结果看起来像一个组合 - 像这样:

postweight = [(1,2.3)(2,5.5)(5,22)(4,30.4)(3,145.2)(1,150.2)]

对于奖励,我想基于距离计算动态地对新的“预重”阵列进行排序。因此,当我移动数组周围的对象时,从最近点到最远点进行排序。有点像这样:

var list1 = List(//stuff in here)
var list2 = List(//stuff in here).toBuffer

list1.forEach(element => foo(element,list2)


def foo(element,list2){
  remove something from list 2
}

提前致谢。我真的很享受这个网站提供的帮助。

2 个答案:

答案 0 :(得分:1)

使用enumerate(..)。当在列表上调用并迭代时,它将列表的元素作为(index, element)的元组返回。

对于问题的后半部分,请使用sorted(.., key=<func>)。使用sorted(..)调用key=时,将使用项目上应用的函数返回的值进行排序。在您的特定情况下,<func>将采用元素并返回元组的第二项。类似于:lambda x: x[1]

>>> pointdistance = [150.2, 2.3, 5.5, 145.2, 30.4, 22]
>>> list(enumerate(pointdistance))
[(0, 150.2), (1, 2.3), (2, 5.5), (3, 145.2), (4, 30.4), (5, 22)]
>>> sorted(enumerate(pointdistance), key=lambda x: x[1])
[(1, 2.3), (2, 5.5), (5, 22), (4, 30.4), (3, 145.2), (0, 150.2)]

答案 1 :(得分:0)

要添加到SuperSaiyan's answer,内置zip为解决所有类似问题提供了更强大的工具。虽然enumerate只是自动将元素列表与其索引配对,但zip要求您提供一系列可以组合在一起的迭代:

obj_labels = ['a', 'b', 'c', 'd']
obj_values = [1, 4, 7, 3]

paired = zip(obj_labels, obj_values)

print(paired) # gives: [('a', 1), ('b', 4), ('c', 7), ('d', 3)]

ordered = sorted(paired, key=lambda pair: pair[1])
print(ordered) # gives: [('a', 1), ('d', 3), ('b', 4), ('c', 7)]

然而,zip还允许你做一些其他很酷的事情,比如分组两个以上的迭代,以及&#34;解压缩&#34;列表元素是等长对。继续前一个例子:

# we can "unzip" our pairs like this
unzipped = zip(*paired)
# they come out as tuples
l1 = list(unzipped[0])
l2 = list(unzipped[1])

# check that we've unzipped
assert l1 == obj_labels
assert l2 == obj_values

# add more data to our paired list
obj_indexes = range(len(obj_values))

paired_len3 = zip(obj_labels, obj_indexes, obj_values)
ordered_len3 = sorted(paired_len3, key=lambda pair: pair[2])
print(ordered_len3) # gives: [('a', 0, 1), ('d', 3, 3), ('b', 1, 4), ('c', 2, 7)]