zip函数有助于元组

时间:2011-04-17 12:40:43

标签: python tuples

我希望有人可以帮助我解决我遇到的问题。我有大量的元组(> 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  

有人可以帮忙吗?非常感谢您的时间。

5 个答案:

答案 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