我有10个交易,包含属性份额和大小。我想要各自的总和。有没有办法在一个循环而不是2?
中完成它我现在如何实现这一目标:
total_shares = sum((t.shares for t in transactions))
total_size = sum((t.size for t in transactions))
答案 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))))
首先生成包含shares
和sizes
的元组,然后zip
将元组转换为两个元组shares
和sizes
,最后sum
1}}将应用于将在t_shares
和t_size
上解压缩的每个元组。
注意: map
,sum
和zip
变体实际上在内部运行的循环多于您在问题中显示的显式两个循环。< / 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)
没有关于这是否是改善的赌注。它甚至可能是一种悲观情绪。