class Solution:
def calculateMinimumHP(self, dlist):
dlist
是一个列表清单。有时dlist
值就像:
[[1],[2],[3],[4]].....
子列表只包含一个项目。我需要对整个列表值求和。我可以使用for
逐个添加值
或者我可以使用reduce()
...
我写道:
reduce(lambda x,y:x+y, [dlist[z][0] for z in dlist[z]])
这是不正确的,它总是给我错误
local variable 'z' referenced before assignment
我该如何修复错误?
答案 0 :(得分:3)
您只需要遍历dlist
,而不是dlist[z]
[z[0] for z in dlist]
更好的是,您可以将其设为generator expression,就像这样
reduce(lambda x,y: x + y, (z[0] for z in dlist), 0)
reduce
的最后一个参数是要使用的默认初始化值。 使用生成器表达式的优点是,您不必真正构建临时列表,而是使用列表解析准备的。
更多好消息,您根本不必使用reduce
(此外the BDFL doesn't encourage using it)。使用sum
函数和生成器表达式,如下所示
sum(z[0] for z in dlist)
答案 1 :(得分:0)
还有更有趣的方式:
sum(sum(dlist, []))
答案 2 :(得分:0)
如果您认为您的输入是可迭代的迭代(而不是严格的列表列表),您可以sum
每个内部可迭代,然后sum
总和:< / p>
def sum_of_sums(iterables):
return sum(sum(itr) for itr in iterables)
这样做的好处是可以使用任何可迭代的迭代,而不仅仅是列表列表。它不假设列表是非空的(空列表上的itr[0]
会引发IndexError
),或者甚至可以依次订阅迭代(itr[some_index]
在生成器上一个TypeError
)。唯一的要求是内部迭代是sum
的有效输入---意味着它们只包含“类似数字”的对象。
我看到的唯一缺点是它没有断言内部列表每个都是严格的一个元素,因此形式错误的输入将返回一个看似合理但可能错误的值。也就是说,验证您的数据并对其进行操作应该是两个不同的步骤:
def calculateMinimumHP(self, dlist):
# Unless your class has already verified this
# somewhere else...
if not self._is_valid_dlist(dlist):
raise ValueError("Meaningful error message.")
return sum_of_sums(dlist)
顺便说一下,如果你的程序处理了很多像列表一样的笨拙的迭代,请查看itertools
module,尤其是recipes部分。