Python: повторять элементы в понимании списка?
У меня есть следующее понимание списка, которое возвращает список объектов координат для каждого местоположения.
coordinate_list = [Coordinates(location.latitude, location.longitude)
for location in locations]
Это работает.
Теперь предположим, что у объекта location есть член number_of_times. Я хочу, чтобы понимание списка генерировало n объектов Coordinate, где n - это number_of_times для конкретного местоположения. Таким образом, если местоположение имеет number_of_times = 5, то координаты этого местоположения будут повторяться 5 раз в списке. (Может быть, это случай для цикла for, но мне любопытно, можно ли это сделать с помощью списочного понимания)
3 ответа
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
Например, вы расширяете с.
Пытаться
coordinate_list = [Coordinates(location.latitude, location.longitude)
for location in locations
for i in range(location.number_of_times)]
Вы можете умножить последовательность на 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), [])