2016-11-30 5 views
0

Например:Как я могу поместить итераторы в структуру типа (iterator [1:], iterator [0])?

d=iter([iter(range(3)),iter(range(4)),iter(range(5))]) 
L1z=zip(d,map(lambda x: next(x),d)) 
for ran,first in L1z: 
    for i in ran: 
     print(first,i) 

Этот код распечатывается:

0 0  
0 1  
0 2 

Но я ожидал, чтобы распечатать:

0 1  
0 2  
0 1  
0 2  
0 3  
0 1  
0 2  
0 3  
0 4 

Почему это неправильно/как я могу это сделать правильно и быстро?

+0

Это работает, если d - это список. – user4757074

ответ

0
d=iter([iter(range(3)),iter(range(4)),iter(range(5))]) 
L1z=((x,next(x)) for x in d) 

Проблема, которую я был первоначально имея в том, что карта оценивает каждый генератор, таким образом, в д удалении весь генератор.

Это решение обертывает d внутри другого генератора.

0

Это довольно сложный подход, я предложу более упрощенный. Во-первых, создать d с помощью простого генератора понимания:

d= (range(1, i) for i in [3, 4, 5]) 

Затем с помощью zip_longest и chain.from_iterable создать zip для каждого диапазона с пустым списком поэтому fillvalue из 0 могут быть применены к нему:

for i in from_it(izip([],i, fillvalue=0) for i in d): 
    print(*i) 

Переименовать несколько вещей, чтобы сделать это немного более компактный:

from_it = chain.from_iterable  
izip = zip_longest 

и вы в конечном итоге с:

for i in from_it(izip([],i, fillvalue=0) for i in d): 
    print(*i) 

, который дает:

0 1 
0 2 
0 1 
0 2 
0 3 
0 1 
0 2 
0 3 
0 4