让我们说,我有一个x,y坐标列表,如:
all_coordinates = [x1,y1,x2,y2,x3,y3,x4,y4...]
还有一种方法:
def rotate_xy_by_theta(self, x, y, theta):
# does the maths
returns new_x, new_y
在给定new_x,new_y
的特定x, y
输入值的情况下,返回每对坐标的theta
位置。
我现在希望迭代上面列表中的所有项目,并生成一个新列表modified_coordinates
。
我可以使用传统的for循环轻松完成这项工作。
可以使用map
函数吗?
类似的东西:
theta = 90
modified_coordinates = map(self.rotate_xy_by_theta(x, y, theta), all_coordinates)
我的问题是如何在上述x,y
函数中获得map
个值对。
答案 0 :(得分:2)
您无法直接使用map()
执行所需操作,因为您没有将函数应用于输入中的每个单独值。您需要在输入中配对值,并且每次都为函数添加一个额外的参数。您的函数还会返回元组坐标,具体取决于您的需要,您可能需要再次展平结果。
使用Iterating over every two elements in a list中的工具和列表理解是更好的选择:
theta = 90
per_two = zip(*([iter(all_coordinates)] * 2))
modified_coordinates = [self.rotate_xy_by_theta(x, y, theta) for x, y in per_two]
这为您提供了(new_x, new_y)
元组的列表,可以说是一种更好的格式来继续处理。如果你确实需要再次展平,你可以添加另一个循环:
modified_coordinates = [coord for x, y in per_two for coord in self.rotate_xy_by_theta(x, y, theta)]
如果你需要modified_coordinates
成为一个惰性生成器(如Python 3中的map()
),你可以改为生成表达式:
modified_coordinates = (self.rotate_xy_by_theta(x, y, theta) for x, y in per_two)
或展平:
modified_coordinates = (coord for x, y in per_two for coord in self.rotate_xy_by_theta(x, y, theta))