Python聚合在一个生成器上

San*_*u C 1 python lambda generator

我有一个生成器,在每次迭代中返回一个列表.列表的每个元素可以是0或1.我想计算返回的元素总数(包括0和1)以及返回的总数.我尝试使用reduce函数实现这个:

t = reduce( (lambda x,y:(y[0]+1,y[1]+x)), gen_fn(), (0,0))

上面的gen_fn()是返回每个yield语句中列表的一部分的生成器.我想通过使用元组(0,0)初始化来实现它.鉴于从生成器返回的元素如下:

[0, 1, 1, 0, 1]

我对t的预期输出是(5,3).但我的代码失败了这个错误消息:

TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

任何人都可以帮我识别问题吗?我缺乏reduce和lambda函数的经验使我无法弄清楚我做错了什么.提前致谢.

Gar*_*tty 6

我认为这里最好的答案是保持简单:

count = 0
total = 0
for item in gen_fn():
    count += 1
    total += item
Run Code Online (Sandbox Code Playgroud)

reduce()在此使用只会降低您的代码的可读性.

如果您的问题是代码高尔夫而且您想要一个衬垫(同时保持懒惰评估),那么您需要:

count, total = collections.deque(zip(itertools.count(1), itertools.accumulate(gen_fn())), maxlen=1).pop()
Run Code Online (Sandbox Code Playgroud)

当然,你会因为简单的解决方案而选择这样的结构.

编辑:

如果发电机产生多个较小的部件,那么只需使用itertools.chain.from_iterable(gen_fn())它来压扁它.