我想要这个列表理解的变体

时间:2015-01-10 03:50:36

标签: python python-2.7

我有10个交易,包含属性份额和大小。我想要各自的总和。有没有办法在一个循环而不是2?

中完成它

我现在如何实现这一目标:

total_shares = sum((t.shares for t in transactions))
total_size   = sum((t.size for t in transactions))

3 个答案:

答案 0 :(得分:3)

不。 sum函数可以一次找到只有一个可迭代的总和。所以,您需要像这样更改代码

total_shares, total_size = 0, 0

for t in transactions:
    total_shares, total_size = total_shares + t.shares, total_size + t.size

或者对您已在问题中显示的代码感到满意。这是完美的,没有错。

如果您真的想使代码复杂化,可以将其更改为

t_shares, t_size = map(sum, zip(*((t.shares, t.size) for t in transactions))))

首先生成包含sharessizes的元组,然后zip将元组转换为两个元组sharessizes,最后sum 1}}将应用于将在t_sharest_size上解压缩的每个元组。

注意: mapsumzip变体实际上在内部运行的循环多于您在问题中显示的显式两个循环。< / p>

答案 1 :(得分:1)

如果您希望全功能,请使用map reduce投放import operator reduce(lambda *tups: map(operator.add, *tups), ((t.shares, t.size) for t in transactions))

{{1}}

但是,如果你只有10个交易,那么你做了多少次通行并不重要。

答案 2 :(得分:0)

您可以使用reduce并编写自己的加法运算符:

from functools import reduce

def add_transaction(x, y):
    # exact details here depend on what a transaction contains
    return Transaction(shares=x.shares + y.shares,
                       size=x.size + y.size)

total_shares, total_size = reduce(add_transaction, transactions)

没有关于这是否是改善的赌注。它甚至可能是一种悲观情绪。