Python 我想要这个列表的变体
我有10笔交易,涉及房地产份额和规模。我要这些的总和。有没有办法在一个循环而不是两个循环中完成 我现在如何做到这一点:Python 我想要这个列表的变体,python,python-2.7,Python,Python 2.7,我有10笔交易,涉及房地产份额和规模。我要这些的总和。有没有办法在一个循环而不是两个循环中完成 我现在如何做到这一点: total_shares = sum((t.shares for t in transactions)) total_size = sum((t.size for t in transactions)) 您可以使用并编写自己的加法运算符: from functools import reduce def add_transaction(x, y): # exac
total_shares = sum((t.shares for t in transactions))
total_size = sum((t.size for t in transactions))
您可以使用并编写自己的加法运算符:
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)
不过,对于这是否是一种进步,没有人敢打赌。这甚至可能是一种悲观情绪。您可以使用并编写自己的加法运算符:
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)
不过,对于这是否是一种进步,没有人敢打赌。这甚至可能是一种悲观。sum函数一次只能找到一个iterable的和。因此,您需要像这样更改代码
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))))
该get首先生成具有共享和大小的元组,然后zip将元组转换为共享和大小的两个元组,最后将总和应用于每个元组,这些元组将在t_共享和t_大小上解包
注意:map、sum和zip变量实际上在内部运行的循环比您在问题中显示的显式两个循环多。不。sum函数一次只能找到一个iterable的和。因此,您需要像这样更改代码
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))))
该get首先生成具有共享和大小的元组,然后zip将元组转换为共享和大小的两个元组,最后将总和应用于每个元组,这些元组将在t_共享和t_大小上解包
注意:map、sum和zip变量实际上在内部运行的循环比您在问题中所显示的显式两个循环要多。如果您想实现完整功能,请使用reduce:
不过,如果你只有10个交易,那么你的传球次数并不重要。如果你想完全发挥作用,可以用你的reduce来绘制一张地图:
尽管如此,如果您只有10个事务,那么您的传递次数并不重要。您认为一个循环可以改变任何东西,而不是两个循环吗?我认为代码看起来不错。请注意,代码中有额外的括号。您可以这样做:sumt.shares for t in transactions,因为sum的括号括住了生成器表达式。您认为是一个循环可以改变任何东西,而不是2个循环吗?我认为代码看起来不错。请注意,代码中有额外的括号。您可以在事务中执行:sumt.shares for t,因为sum的括号包含生成器表达式。FYI,reduce也可以作为Python 2上的内置代码使用。它只是作为Python的一部分移出了主名称空间3@njzk2:你说得对,我忘了OP将数据类型从一对更改为一个事务。仅供参考,reduce也可以作为Python 2上的内置项提供。它只是作为Python的一部分移出了主名称空间3@njzk2:你说得对,我忘了OP将数据类型从一对更改为一个事务。我打算建议使用map sum zip变量。我想指出的是,它并没有真正减少循环、thoughOr mapsum、zip*mapattrgetter'shares、'size'事务的数量,从而实现真正的功能我将拒绝在交易中为t发布s=sumt.shares+t.size*1j;total_shares,total_size=s.real,s.imag作为答案,因为这太疯狂了。@DSM lol,我在一个佳能问题中看到了这个答案。那真是邪恶…:D人们在高尔夫球场上使用它。。这就是关键所在,真的:没有原生的方法来实现这一点,正如你所说的,我们编写循环,如果我们真的在意的话,我们将它包装在一个函数中,然后我们继续我们的一天..我打算建议使用map sum zip变体。我想指出的是,它并没有真正减少循环、thoughOr mapsum、zip*mapattrgetter'shares、'size'事务的数量,从而实现真正的功能我将拒绝在交易中为t发布s=sumt.shares+t.size*1j;total_shares,total_size=s.real,s.imag作为答案,因为这太疯狂了。@DSM lol,我在一个佳能问题中看到了这个答案。那真是邪恶…:D人们在高尔夫球场上使用它。。这就是关键所在,真的:没有原生的方法来实现这一点,所以正如你所说的,我们编写循环,如果我们真的在乎的话,我们将它包装在一个函数中,然后继续我们的一天。。