2015-08-22 2 views
0

Скажем, у меня есть список х, у координаты, как:Используя карту, чтобы создать новый список

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.

Я могу сделать это легко с помощью традиционного для петли.

Это можно сделать с помощью функции map?

Что-то вроде:

theta = 90  
modified_coordinates = map(self.rotate_xy_by_theta(x, y, theta), all_coordinates) 

Моя проблема заключается в том, как получить x,y значения в паре в приведенном выше map функции.

+0

Почему бы вам не использовать лучшую структуру, чтобы сохранить свои координаты? Даже что-то вроде 'all_coordinates = [[x1, x2, x3, x4], [y1, y2, y3, y4]]' –

+0

О, если бы я мог это сделать. Я получаю 'all_coordinates' от api, который не под моим контролем. – oat

+2

ну, вы можете получить х-координаты по 'x_coords = all_coordinates [:: 1]' и y-координаты по y = all_coordinates [1 :: 2] ' –

ответ

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 быть ленивым генератора (как map() в Python 3) вы можете сделать это выражение генератора вместо:

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)) 
Смежные вопросы