2015-08-14 46 views
2

問題是關於體育編程。 我從stdin得到一個巨大的字符串,如果char等於'。',我必須爲每個具有True值的字符創建一個字節的數組。否則爲False值。同時,當我們有兩個''時,我應該計算案例數量。'彼此靠近的符號。Python 3:在生成器中執行額外的計算

問題1:可以是發電機表達內部進行使用了發電機之後可訪問一些額外的計算 - 求和,計數,更復雜的計算,以避免在創建的列表附加循環?

問題2:我可以訪問生成器表達式中以前的循環結果嗎?我嘗試在一個生成器表達式中執行下面的第二個解決方案。

因爲這是競爭,所以不能使用外部庫。

1解決方案

res = 0: prev = False 
s = bytearray() 
for c in (c == '.' for c in 'a' + input() + 'a'): 
    res += c and prev 
    prev = c 
    s.append(c) 

第二個解決方案

s = bytearray(c == '.' for c in 'a' + input() + 'a') 
res = sum(map(all,zip(s[1:],s[:-1]))) 

UPD:與itertools.tee()第三解決方案 - 不幸的是這種解決方案比第一次更快,但比第二

i1,i2,i3 = tee((c == '.' for c in 'a' + input() + 'a'),3) 
next(i1) 
res = sum(a and b for a,b in zip(i1,i2)) 
s = bytearray(i3) 

回答

2

問題1:可以進行一些額外的計算在發生器表達式內部形成,在發生器被使用後可以訪問 - 求和,計數,更復雜的計算以避免在創建的列表上進一步循環?

沒有生成器是一個關閉iterables,你不能在一次迭代後使用它們。

問題2:我可以在生成器表達式中訪問以前的循環結果嗎?我嘗試在一個生成器表達式中執行下面的第二個解決方案。

所以,如果你想訪問你可以簡單地使用zip生成器表達式的上一個項目的迭代:

inp='a' + input() + 'a' 
(next=='.' and pre== '.' for pre,next in zip(inp,inp[1:])) 

但是,如果你想獲得一臺發電機的前一個項目,你可以使用itertools.tee從您的生成器創建2個獨立的迭代器,並使用zip函數創建一個新的生成器(在python 2中使用itertools.izip)包含prev和next項的對。

from itertools import tee 
new_generator,MY_generator=tee(MY_generator) 
next(new_generator) 

zipped_generator = zip(new_generator,My_generator) 

而且在反覆做:

[for pre,next in zipped_generator] 
+0

謝謝,我甚至沒想到能夠使用itertools在比賽:) –