2017-03-03 56 views
0

我該怎麼做?拆分生成器,獨立處理並再次壓縮

sample_generator = get_sample_generator() # This generator yields tuples (label(i), data(i)) 


label_generator = ??? 
data_generator = ??? 

processed_data_generator = process_data_generator(data_generator) 

processed_sample_generator = zip(label_generator, processed_data_generator) # Labels and corresponding data again as tupel (label(i), processed_data(i)) 

很明顯,我不能只是映射()的sample_generator到標籤和數據生成因爲兩者會向前移動sample_generator ...

+0

是太大了,從它創建一個列表? – njzk2

+0

從這個意義上講,你不能分裂一臺發電機。要訪問你的兩個元素元組的每一個第二項,你需要使用'sample_generator' –

+0

爲什麼你想這樣做? –

回答

1

使用itertools.tee將發生器拆分爲2.您仍需要各個進程來拆分結果值。

from itertools import count 

def generator(): 
    for c in count(): 
     yield 'label {}'.format(c), 'data {}'.format(c) 

from itertools import tee 

label_generator, data_generator = tee(generator()) 

print("labels:") 
for _ in range(5): 
    print(next(label_generator)[0]) 
print() 
print("data:") 
for _ in range(5): 
    print(next(data_generator)[1]) 
+0

這似乎沒問題。我想我也可以使用'''map(lamda x:x [0],label_generator)'''來代替使用單獨的進程,並且對於數據也是一樣的。 –

1

使用tee複製原來的發電機,然後分裂的一個複製以獲取數據。

sample1, sample2 = itertools.tee(sample_generator, 2) 
processed_data_generator = process_data_generator(d for (l,d) in sample1) 
processed_sample_generator = sample2 
+0

如果'processed_sample_generator'只是與'sample_generator'相同,我認爲它不會被「處理」太多...... –

0

拼合sample_generator和既有label_generatordata_generator採取如此:

import itertools 
label_generator = data_generator = itertools.chain.from_iterable(sample_generator) 
+0

對於處理我有一個現有的不可更改的API:/ –

+0

@TimJoseph這將是很好的知道。無論如何,再看一遍,我用完全不同的方法取代了我的解決方案。 –