我有一个元组列表:
a = [(1, 2), (1, 4), (1, 6)]
我想使用reduce函数来获得这个结果:
(3, 12)
我尝试了:
x = reduce(lambda x, y: x+y, a)
但是我遇到了一个错误……我想将每个元组的第一个索引中的所有元素相加,然后再加上第二个元素。
reduce
的输出是一个元组,则所有中间结果也应该是元组。a = [(1, 2), (1, 4), (1, 6)]
print reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), a)
输出
(3, 12)
编辑:如果你希望在列表为空时得到 (0, 0)
a = []
print reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), [(0, 0)] + a)
输出
(0, 0)
编辑2: Reduce函数的最后一个参数可以使用默认初始化程序进行可选设置。通过使用该初始化程序,代码变为:
a = []
print reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), a, (0, 0))
>>> a = [(1, 2), (1, 4), (1, 6)]
>>> map(sum, zip(*a))
[3, 12]
更新
根据Raymond Hettinger的说法,zip-star技巧滥用堆栈来昂贵地计算转置。
这里有一个替代方案,不使用列表推导。
>>> a = [(1, 2), (1, 4), (1, 6)]
>>> [sum(item[i] for item in a) for i in range(2)] # 2 == len(a[0])
[3, 12]
>>> a = []
>>> [sum(item[i] for item in a) for i in range(2)] # 2 == len(a[0])
[0, 0]
tuple(map(sum, zip(*a)))
。 - aIKid>>> a = [(1, 2), (1, 4), (1, 6)]
>>> reduce(lambda (sx, sy), (x, y): (sx+x, sy+y), a)
(3, 12)
请尝试这个:
>>> from numpy import asarray
>>> a = asarray([(1, 2), (1, 4), (1, 6)])
>>> reduce(lambda x,y:x+y, a)
array([ 3, 12])
reduce
接受可选的initializer
:reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), a, (0, 0))
。 - falsetru