2016-11-30 126 views
0

例如:如何將迭代器壓縮到(迭代器[1:],迭代器[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從而刪除整個發電機。

該解決方案將d包裹在另一個發生器內。

0

這是一個相當複雜的方法,我會提供一個更簡單的方法。首先,創建d用一個簡單的發電機理解:

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

然後,用zip_longestchain.from_iterable的幫助下創建的每個範圍zip與空列表,這樣的0fillvalue可以應用到它:

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