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

Python 使用枚举和排序创建新列表,python,Python,我对python和一般的编码是全新的。我实际上是一个电影4D艺术家。C4D有一个内置的python脚本管理器。我会尽我最大的努力来解释我的目的 我有一个球体。球体被分成若干点。我已经计算了球体上的每个点离不同物体的距离。我列出了所有这些计算出的距离。我想做一个新的索引数组和相应的距离计算。如何将这两个列表合并到一个新数组中?下面的模拟示例- def main(): pointdistance = [150.2, 2.3, 5.5, 145.2, 30.4, 22] indices

我对python和一般的编码是全新的。我实际上是一个电影4D艺术家。C4D有一个内置的python脚本管理器。我会尽我最大的努力来解释我的目的

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

def main():
    pointdistance = [150.2, 2.3, 5.5, 145.2, 30.4, 22]
    indices = list(range(len(pointdistance)))

    print indices
它返回所需的正确索引数[0,1,2,3,4,5] 我期望的结果看起来像一个组合-类似于这样:

preweight = [(0,150.2)(1,2.3)(2,5.5)(3,145.2)(4,30.4)(5,22)]
postweight = [(1,2.3)(2,5.5)(5,22)(4,30.4)(3,145.2)(1,150.2)]
作为奖励,我想根据距离计算动态排序新的“预加权”数组。所以当我在数组中移动对象时,从最近的点排序到最远的点。有点像这样:

preweight = [(0,150.2)(1,2.3)(2,5.5)(3,145.2)(4,30.4)(5,22)]
postweight = [(1,2.3)(2,5.5)(5,22)(4,30.4)(3,145.2)(1,150.2)]
提前谢谢。我真的很享受这个网站提供的帮助。

使用
枚举(…)
。在列表上调用并迭代时,它将以
(index,element)
元组的形式返回列表中的元素

对于问题的后半部分,请使用排序(..,key=)<代码>排序(..)当使用
键=
调用时,将使用应用于项的函数返回的值进行排序。在您的特定情况下,
将接受一个元素并返回元组的第二项。类似于:
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)]
此外,内置的工具为解决所有类似的问题提供了更强大的工具。虽然
enumerate
只是将元素列表与其索引自动配对,
zip
要求您提供一系列它将分组在一起的iterables:

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
还允许您执行其他一些很酷的操作,例如将两个以上的iterable分组,以及“解压缩”等长对的列表元素。继续上一个示例:

# 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)]

只是一个迂腐的音符。。。enumerate不“返回新列表”哇,感谢您的快速响应。我非常感谢你的帮助。到目前为止,这似乎是完美的。现在,我将在下周花全部时间尝试将这些数据实现为一个实际的动画,并带回来一些特定于C4D的python问题,我确信。@SuperSaiyan非常感谢!我应该用新的思路问一个后续问题吗?或者有更好的跟进方法吗?你可以在这里作为评论,除非它不是偏离主题。注意:不是每个人都同意,但它(稍微)更快,而且在我看来,一般来说,当内置程序可以为你做时,最好避免使用
lambda
函数<代码>从操作员导入itemgetter,然后使用
键=itemgetter(1)
进行排序。我之所以避免使用
lambda
,是因为
lambda
具有无限的灵活性,可以用于棘手的事情,我为此保留了它们;如果我需要做一些棘手的事情,我会使用
lambda
来提醒自己和维护人员,我不应该掩盖我正在做的事情,这可能会很奇怪。我用内置的说“我没有做任何棘手的事情,请随意跳过”。哦,这是一个非常有趣的功能!非常感谢。它反复提到我的后续问题是什么。我会试着仔细地解释一下PS:很抱歉,这是我第一次访问该网站,我似乎不知道如何在评论中添加代码:我想将距离变量与全局位置向量相结合。因此,一个示例数组应该是这样的-pointA=[22.5,Vector(100100100)],然后我可以解压它来访问向量值吗?写``它将呈现为
。当回答带有特定语言标记的问题时,它会自动添加语法突出显示(强制突出显示)。至于向量问题,是的。如果
v_i
是一个向量,
d_i
i
[1,2,…n]
中的距离,我们有
对=[(d_1,v_1),(d_2,v_2),…(d_n,v_n)]
我们可以使用
zip
来用
距离,向量=zip对来分离向量和距离。
(但请记住,
distance
vectors
以元组的形式出现,而不是列表)。非常感谢!这太棒了。我在尝试时得到了一个。这有什么原因吗?或者我的语法可能是错误的吗?哦,我想我明白了!断言正在检查obj_dis和l2是否完全相同。但它们不是==因为obj_dis是“未排序的”,l2是“已排序的”。再次感谢威士忌!你帮了我很大的忙!