Пропустить итератор в понимании списка? - PullRequest
5 голосов
/ 06 октября 2010

Есть ли более элегантный способ написать следующий кусок Python?

[foo() for i in range(10)]

Я хочу собрать результаты функции foo () в списке, но мне не нужен итератор i.

Ответы [ 4 ]

5 голосов
/ 06 октября 2010

Один из способов сделать это - использовать _:

[foo() for _ in range(10)]

Это означает то же самое, но по соглашению использование _ указывает читателю, что индекс фактически не используется ни для чего.

Предположительно foo() возвращает что-то новое каждый раз, когда вы звоните. Если это не так и каждый раз возвращает одно и то же, вы можете:

[foo()] * 10

для репликации результата вызова foo() один раз, 10 раз в список.

0 голосов
/ 06 октября 2010

map было бы неплохо, если бы foo () приняла аргумент, но это не так.Поэтому вместо этого создайте фиктивную лямбду, которая принимает целочисленный аргумент, но просто вызывает foo ():

map(lambda i:foo(), range(10))

Если вы используете Python 3.x, map возвращает итератор вместо списка - просто создайтесписок с этим:

list(map(lambda i:foo(), range(10)))
0 голосов
/ 06 октября 2010

map(lambda _ : foo(), range(10))

хотя это обменивает вашу проблему с бессмысленным итератором i с новым бессмысленным аргументом в лямбда-выражении.

0 голосов
/ 06 октября 2010

Отнюдь не элегантнее, но:

[x() for x in [foo]*10]

Я думаю, что кроме этого вы должны перейти к Руби;)

...