Хммм. Здесь был ответ со списком, но он исчез.
Здесь:
[i for i,x in enumerate(testlist) if x == 1]
Пример:
>>> testlist
[1, 2, 3, 5, 3, 1, 2, 1, 6]
>>> [i for i,x in enumerate(testlist) if x == 1]
[0, 5, 7]
Update:
Итак, вы хотите выражение генератора, мы будем иметь выражение генератора. Вот список понимание снова в цикле:
>>> for i in [i for i,x in enumerate(testlist) if x == 1]:
... print i
...
0
5
7
Теперь мы построим генератор ...
>>> (i for i,x in enumerate(testlist) if x == 1)
<generator object at 0x6b508>
>>> for i in (i for i,x in enumerate(testlist) if x == 1):
... print i
...
0
5
7
и достаточно niftily, мы можем назначить, что переменной, и использовать его оттуда ...
>>> gen = (i for i,x in enumerate(testlist) if x == 1)
>>> for i in gen: print i
...
0
5
7
И думать, что я писал FORTRAN.
replace range() с помощью xrange() - range() создает список, xrange() создает итератор. xrange() использует waaaay меньше памяти, а внутренний вызов выполняется быстрее. – gnud 2008-12-13 01:39:38
Я соглашаюсь на большие списки в программах python 2. Обратите внимание, что «диапазон» все равно будет работать в python 3 (и работает как xrange IIRC). «xrange» идет по пути динозавров. – jakber 2008-12-13 01:44:41
Обновление: `xrange` отбрасывается в Python 3.x, так как новый` range` является старым `xrange` – 2017-03-13 12:51:07