在Python中处理嵌套列表

4
list_ = [(1, 2), (3, 4)]

什么是Pythonic的方式来获取内部元组中有序对的总和并将总和相乘? 对于上面的示例:
(1 + 3) * (2 + 4) = 24

1
如果有3个元组:list_ = [(1,2), (3,4), (5,6)]会发生什么? - erip
@erip (1+3+5) * (2+4+6) = 108 @erip (1+3+5) * (2+4+6) = 108 - blackened
2个回答

7

例如:

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()

@PeterWood 当然可以,为什么不呢? - erip
2
由于reduce在Python 3中被移除,因此@erip。请参阅https://docs.python.org/3.0/whatsnew/3.0.html#builtins。 - MB-F
1
@eumiro 只是为了增加可用选项:与其导入 operator.mul,使用 lambda x, y: x * y 也可以正常工作。虽然实际上一开始使用 op.mul 也没有什么问题 :)。 - Nelewout
@kazemakase:感谢您提供reduce信息 - 我已经更新了答案。 - eumiro
1
@blackened:functools.reduce(op.mul, (sum(x) for x in list(zip(*list_))[:-1])) 怎么样? - eumiro
显示剩余9条评论

0
如果列表很小,我认为使用operatoritertools来处理这样的问题就像用大锤子敲螺丝钉一样。同样的,numpy也是如此。纯Python有什么问题吗?
result = 1
for s in [ sum(x) for x in zip( *list_) ]: 
  result *= s

虽然如果纯Python也内置了productsum会更好,但这并不是必须的。另外,如果你只处理2元组对,那么任何形式的迭代都是一种过度设计。只需编写以下代码:

result = (list_[0][0]+list_[1][0] )*( list_[0][1]+list_[1][1])

1
你也可以说,使用 zip(*) 是一个大材小用的做法,因为你完全可以用纯 Python 实现。使用 reduce 只是让你的代码更加简洁,但实现的功能与你的代码是一样的。 - jamylak
是的,reducezip 都是内置函数,只是我个人觉得这种方式更易于阅读。 - nigel222
实际上,我的先前说法是错误的。zip 是 Python 3 的内置函数,但 reduce 不是,所以我的方法适用于 Python 2/3。 - nigel222

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接