簡體   English   中英

zip函數幫助元組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM