list_ = [(1, 2), (3, 4)]
什么是Pythonic的方式来获取内部元组中有序对的总和并将总和相乘? 对于上面的示例:
(1 + 3) * (2 + 4) = 24
list_ = [(1, 2), (3, 4)]
(1 + 3) * (2 + 4) = 24
例如:
import operator as op
import functools
functools.reduce(op.mul, (sum(x) for x in zip(*list_)))
这个解决方案适用于初始数组和内部元组的任意长度。
使用numpy的另一个解决方案:
import numpy as np
np.array(list_).sum(0).prod()
reduce
在Python 3中被移除,因此@erip。请参阅https://docs.python.org/3.0/whatsnew/3.0.html#builtins。 - MB-Foperator.mul
,使用 lambda x, y: x * y
也可以正常工作。虽然实际上一开始使用 op.mul
也没有什么问题 :)。 - Nelewoutreduce
信息 - 我已经更新了答案。 - eumirofunctools.reduce(op.mul, (sum(x) for x in list(zip(*list_))[:-1]))
怎么样? - eumirooperator
和itertools
来处理这样的问题就像用大锤子敲螺丝钉一样。同样的,numpy
也是如此。纯Python有什么问题吗?result = 1
for s in [ sum(x) for x in zip( *list_) ]:
result *= s
虽然如果纯Python也内置了product
和sum
会更好,但这并不是必须的。另外,如果你只处理2元组对,那么任何形式的迭代都是一种过度设计。只需编写以下代码:
result = (list_[0][0]+list_[1][0] )*( list_[0][1]+list_[1][1])
zip(*)
是一个大材小用的做法,因为你完全可以用纯 Python 实现。使用 reduce
只是让你的代码更加简洁,但实现的功能与你的代码是一样的。 - jamylakreduce
和 zip
都是内置函数,只是我个人觉得这种方式更易于阅读。 - nigel222zip
是 Python 3 的内置函数,但 reduce
不是,所以我的方法适用于 Python 2/3。 - nigel222
list_ = [(1,2), (3,4), (5,6)]
会发生什么? - erip(1+3+5) * (2+4+6) = 108
@erip(1+3+5) * (2+4+6) = 108
- blackened