我希望有人可以帮助我解决我遇到的问题。我有大量的元组(> 500),如下所示:
(2,1,3,6)
(1,2,5,5)
(3,0,1,6)
(10,1,1,4)
(0,3,3,0)
我的代码片段为:
sum1 = (A,B,C,D) # creates a tuple of sums of (A,B,C,D)
mysum = map(sum, zip(A, B, C, D))
print(mysum)
我意识到上面的代码不正确。我试图找到一种方法将所有值A加在一起,B的所有值,C的所有值以及D的所有值一起使用zip函数。例如,我想打印一些如下所示的内容:
Asum = 16
Bsum = 7
Csum = 13
Dsum = 21
有人可以帮忙吗?非常感谢您的时间。
答案 0 :(得分:14)
>>> zip((1,2,3),(10,20,30),(100,200,300))
[(1, 10, 100), (2, 20, 200), (3, 30, 300)]
>>> [sum(x) for x in zip((1,2,3),(10,20,30),(100,200,300))]
[111, 222, 333]
使用任意大量的元组来执行此操作:
>>> myTuples = [(1,2,3), (10,20,30), (100,200,300)]
>>> [sum(x) for x in zip(*myTuples)]
[111, 222, 333]
旁注:在python3中,请注意zip返回一个惰性迭代,你总是可以显式地变成一个列表,就像任何其他类型的iterable:list(zip(...))
(感谢Seganku在编辑中的示例中捕获错误,其中三次被其他编辑拒绝)
答案 1 :(得分:4)
map(sum, zip(a, b, c, d, e))
第一次调用zip
,反转列表 - 列出所有第一个元素,所有第二个元素等等。
第二个调用map
在其第二个参数上调用它的第一个参数sum
,这些列表返回sum
的结果列表 - 恰好是总和。
答案 2 :(得分:2)
你的集合大小相同,并且你使用的是C Python,你应该考虑使用numpy。你可以这样做numpy:
In [5]: sets = ((2,1,3,6),
...: (1,2,5,5),
...: (3,0,1,6),
...: (10,1,1,4),
...: (0,3,3,0) )*100
In [6]: import numpy as np
In [7]: A = np.array(sets)
In [8]: np.sum(A, axis=0)
Out[8]: array([1600, 700, 1300, 2100])
Numpy将您的值转换为数组,并使用优化的LAPACK函数有效地使用它们。
为了比较性能,我在两组假设下进行了分析。在第一个中,我假设您的数据被存储,以便导入到Numpy数组是有效的,所以我没有包括将集转换为数组所需的时间。我将np.sum的性能与[zip(* sets)中的x的和(x)进行了比较]。以下是每种情况的时间结果:
Excluding numpy Array Conversion: 0.0735958760122
Including numpy Array Conversion: 17.1435046214
Plain old zip: 0.660146750495
结论是,如果输入数据可以很容易地导入numpy,那么numpy会更快。
答案 3 :(得分:0)
如果列表中包含所有元组,则可以使用reduce()
:
>>> list(reduce(lambda x,y: (i+j for i,j in zip(x,y)), tuples, [0]*4))
[16, 7, 13, 21]
答案 4 :(得分:0)
tuples = [(2,1,3,6), (1,2,5,5), (3,0,1,6), (10,1,1,4), (0,3,3,0)]
s = [sum(tup) for tup in zip(*tuples)]
Asum, Bsum, Csum, Dsum = s