我是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
}
提前致谢。我真的很享受这个网站提供的帮助。
答案 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)]