Python 在这种情况下如何使用reduce?
Python 在这种情况下如何使用reduce?,python,python-2.7,Python,Python 2.7,dlist是一个列表列表。有时dlist值就像: class Solution: def calculateMinimumHP(self, dlist): 子列表仅包含一项。我需要对整个列表值求和。我可以使用for逐个添加值 或者我可以使用reduce() 我写的是: [[1],[2],[3],[4]]..... 这是不正确的,它总是给我错误 赋值前引用的局部变量“z” 如何修复错误?您只需迭代dlist,而不是通过dlist[z] reduce(lambda x,y:x+y, [
dlist
是一个列表列表。有时dlist
值就像:
class Solution:
def calculateMinimumHP(self, dlist):
子列表仅包含一项。我需要对整个列表值求和。我可以使用for
逐个添加值
或者我可以使用reduce()
我写的是:
[[1],[2],[3],[4]].....
这是不正确的,它总是给我错误
赋值前引用的局部变量“z”
如何修复错误?您只需迭代
dlist
,而不是通过dlist[z]
reduce(lambda x,y:x+y, [dlist[z][0] for z in dlist[z]])
更妙的是,你可以像这样
[z[0] for z in dlist]
reduce(lambda x,y: x + y, (z[0] for z in dlist), 0)
要使用的最后一个参数是默认初始值设定项值。使用生成器表达式的优点是,您不必真正构建临时列表,这是您使用列表理解准备的
更多的好消息是,您根本不必使用reduce
(而且)。使用函数和生成器表达式,如下所示
[z[0] for z in dlist]
reduce(lambda x,y: x + y, (z[0] for z in dlist), 0)
还有一种更有趣的方式:
sum(z[0] for z in dlist)
如果您认为您的输入是一个iterable of iterable(与严格意义上的列表列表相反),您可以
sum
每个内部iterable,然后sum
求和:
sum(sum(dlist, []))
这样做的好处是可以处理任意一个iterable,而不仅仅是列表列表。它并不假定列表是非空的(itr[0]
在空列表上会引发一个索引器
),甚至不假定可以订阅iterables(itr[some_index]
在生成器上是一个类型错误
)。唯一的要求是内部iterables必须是sum的有效输入,这意味着它们只包含“类似数字”的对象
我看到的唯一缺点是,它不能断言内部列表严格地每个元素一个,因此格式错误的输入将返回一个看似合理但可能错误的值。也就是说,验证数据和对其进行操作应该是两个不同的步骤:
def sum_of_sums(iterables):
return sum(sum(itr) for itr in iterables)
顺便说一下,如果您的程序正在处理许多棘手的问题,如列表列表,请查看,尤其是部分