2015-04-18 3 views
2

В принципе, я в следующей ситуации - я генерирую список, например.Множественное использование генератора из списка в Python

l = [2*x for x in range(10)] 

, который я повторяю позже, в несколько раз, например.

for i in l: print i # 0,2,4,6,8,10,12,14,16,18 
for i in l: print i # 0,2,4,6,8,10,12,14,16,18 
for i in l: print i # 0,2,4,6,8,10,12,14,16,18 

Проблема заключается в том, что список слишком велик, чтобы поместиться в памяти, поэтому я использую его форму генератора, а именно:

l = (2*x for x in range(10)) 

Однако после этого строительства только первой итерации работ:

for i in l: print i # 0,2,4,6,8,10,12,14,16,18 
for i in l: print i # 
for i in l: print i # 

В чем проблема? Как я могу перебирать его через несколько раз?

ответ

6

Ваш генератор исчерпан в первый раз. Вы должны обновить свой генератор каждый раз возобновлять это:

l = (2*x for x in range(10)) 
for i in l: print i 
l = (2*x for x in range(10)) 
for i in l: print i 

(Примечание: Вы должны использовать xrange в Python 2, поскольку range создает список в памяти)

Вы можете создать также функцию быстрого доступа к помочь вам или даже generator function:

def gen(): 
    for i in range(10): 
     yield 2 * i 

, а затем:

for i in gen(): print i 
for i in gen(): print i 
+0

Следует, вероятно, отметить, что 'xrange' является версией генератора' range' в Python 2, в то время как 'range' в питона 3+ генератор и нет 'xrange'. –

+0

@MylesGallagher да, я обновил. Я догадался, что мы говорили только для python 2. – JuniorCompressor

+0

Мне нравится функция генератора. В качестве альтернативы, для такого простого генератора допустима лямбда, например, «gen = lambda: (2 * x для x в xrange (10))». И, конечно, любой из этих функций может быть задан множителями и аргументами длины, чтобы сделать их более универсальными. –

0

Вы также можете перебирать на генератор непосредственно:

for i in (2*x for x in range(10)): print i 
for i in (2*x for x in range(10)): print i 
... 
+0

Правда, но это не [СУХОЙ] (http://en.wikipedia.org/wiki/Don%27t_repeat_yourself). –