【发布时间】:2014-05-07 22:14:25
【问题描述】:
我有一个生成器,它在每次迭代中返回一个列表。列表的每个元素可以是 0 或 1。我想计算返回的元素总数(包括 0 和 1)和返回的 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)。但是我的代码失败并显示此错误消息:
类型错误:+ 不支持的操作数类型:“int”和“tuple”谁能帮我找出问题所在?我缺乏使用 reduce 和 lambda 函数的经验,这让我无法弄清楚我做错了什么。提前致谢。
【问题讨论】:
-
我有点困惑。您的生成器是每次通过都产生一个值,还是一个值列表?也就是说,
[0, 1, 1, 0, 1]是单个值(例如next(gen_fn()),还是整个值集(例如来自list(gen_fn())? -
@Blckknght 我错了;
y必须是列表,而不是整数,否则错误消息会有所不同。错误是针对y[1] + x;x是元组,所以y必须是整数的可索引容器。 -
尽管如此; OP,你为什么期望输出是
(5, 3)?gen_fn()是否只有yield一个值? -
有趣的是,我几乎说服@jonrsharpe 它返回列表,同时他几乎说服我它返回整数。似乎我们必须等待 OP 澄清,因为他的问题中的一个句子否定了另一个句子。
-
上面的 gen_fn() 是在每个 yield 语句中返回部分列表的生成器 向我暗示它是多个列表,示例本质上只是
[[0, 1, 1, 0, 1]]- >(5,3).