Python: повторять элементы в понимании списка? - PullRequest
4 голосов
/ 17 мая 2010

У меня есть следующее понимание списка, которое возвращает список объектов координат для каждого местоположения.

coordinate_list = [Coordinates(location.latitude, location.longitude)
                   for location in locations]

Это работает.

Теперь предположим, что объект местоположения имеет член number_of_times. Я хочу, чтобы понимание списка генерировало n объектов Coordinate, где n - это number_of_times для конкретного местоположения. Таким образом, если местоположение имеет number_of_times = 5, то координаты этого местоположения будут повторяться 5 раз в списке. (Может быть, это случай для цикла for, но мне любопытно, можно ли это сделать с помощью списочных представлений)

Ответы [ 3 ]

7 голосов
/ 17 мая 2010
coordinate_list = [x for location in locations
                   for x in [Coordinates(location.latitude,
                                         location.longitude)
                            ] * location.number_of_times]

Редактировать : OP предполагает, что цикл может быть более четким, что, учитывая длину идентификаторов, безусловно, возможно. Тогда эквивалентный код будет выглядеть примерно так:

coordinate_list = [ ]
for location in locations:
    coord = Coordinates(location.latitude, location.longitude)
    coordinate_list.extend([coord] * location.number_of_times)

Цикл выглядит нормально, отчасти потому, что здесь хорошо работает метод списков extend, а отчасти потому, что вы можете дать имя экземпляру Coordinate, который вы расширяете.

6 голосов
/ 17 мая 2010

Попробуйте

coordinate_list = [Coordinates(location.latitude, location.longitude)
                   for location in locations 
                   for i in range(location.number_of_times)]
0 голосов
/ 17 мая 2010

Вы можете умножить последовательность на значение number_of_times. Поэтому [1,2] * 3 будет равно [1, 2, 1, 2, 1, 2]. Если вы получите свои координаты в списке, а затем умножьте список на количество повторений, ваш результат должен быть [координаты, координаты, координаты].

def coordsFor(location):
   return coord = [Coordinates(location.latitude, location.longitude) ]*location.number_of_times

Объединить координаты для каждого элемента в списке.

reduce(operator.add, map(coordsFor, locations), [])
...