[英]zip function help with 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)
我意識到上面的代碼是不正確的。 我正在嘗試找到一種方法,使用zip函數將所有A值,B的所有值,C的所有值以及D的所有值相加。 例如,我要打印如下內容:
Asum = 16
Bsum = 7
Csum = 13
Dsum = 21
有人可以幫忙嗎? 非常感謝你花時間陪伴。
>>> 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返回了一個懶惰的可迭代對象,您可以隨時將其像其他任何可迭代對象一樣顯式地轉換為列表:list(zip(...))
(感謝Seganku在編輯中發現示例中的錯誤,該編輯被其他編輯三次拒絕)
map(sum, zip(a, b, c, d, e))
第一次調用zip
反轉列表-列出所有第一個元素,所有第二個元素等的列表。
第二個調用map
對其第二個參數(這些列表)調用其第一個參數sum
,並返回sum
結果的列表-恰好是sum。
如果您的集合大小都相同,並且您正在使用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的sum(x)]進行了比較。 這是每種情況的時間結果:
Excluding numpy Array Conversion: 0.0735958760122
Including numpy Array Conversion: 17.1435046214
Plain old zip: 0.660146750495
結論是,如果可以使用numpy輕松導入輸入數據,則numpy速度更快。
如果列表中包含所有元組,則可以使用reduce()
:
>>> list(reduce(lambda x,y: (i+j for i,j in zip(x,y)), tuples, [0]*4))
[16, 7, 13, 21]
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.