2015-08-14 45 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在比赛:) –