在这种情况下如何使用reduce?

时间:2015-02-07 14:47:08

标签: python python-2.7

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

我该如何修复错误?

3 个答案:

答案 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部分。