问题是体育节目。 我从stdin得到一个巨大的字符串,我必须为每个char创建一个字节数组,如果char等于',则为True值。并且否则为False值。同时,当我们有两个''时,我应该计算案件的数量。彼此靠近的符号。
问题1:在使用生成器之后可以在生成器表达式内执行一些额外的计算 - sum,count,更复杂的计算以避免在创建的列表上进行额外的循环?
问题2:我可以在生成器表达式中访问先前的循环结果吗?我尝试在一个生成器表达式中执行下面的第二个解决方案。
由于这是竞争,因此无法使用外部库。
第一个解决方案
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)
答案 0 :(得分:2)
问题1:在使用生成器之后可以在生成器表达式内执行一些额外的计算 - sum,count,更复杂的计算以避免在创建的列表上进行额外的循环?
没有一个生成器是一个关闭的迭代,你不能在一次迭代后使用它们。
问题2:我可以在生成器表达式中访问先前的循环结果吗?我尝试在一个生成器表达式中执行下面的第二个解决方案。
因此,如果您想访问生成器表达式中的上一个项目,只需在您的iterable上使用zip
:
inp='a' + input() + 'a'
(next=='.' and pre== '.' for pre,next in zip(inp,inp[1:]))
但是如果你想访问生成器的前一项,你可以使用itertools.tee
从你的生成器创建2个独立的迭代器,并使用zip
函数创建一个新的生成器(在python 2中使用{ {1}})包含与prev和next项对的对。
itertools.izip
在迭代中执行:
from itertools import tee
new_generator,MY_generator=tee(MY_generator)
next(new_generator)
zipped_generator = zip(new_generator,My_generator)