使用map生成新列表

时间:2015-08-22 19:38:29

标签: python python-3.x

让我们说,我有一个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个值对。

1 个答案:

答案 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))