2015-02-24 227 views
1

我正在處理大量記錄集,並且需要爲每個客戶帳戶總計給定字段以達到總體帳戶餘額。雖然我可以將數據放在任何合理的形式,但我認爲最簡單的方法是在處理每條記錄時,元組列表(cust_id,balance_contribution)。經過一輪處理後,我想爲每個cust_id添加第二項,並且我試圖在數千次數據循環中不循環數據。使用Python爲元組中的每個給定第一個值計算元組的第二個值

作爲一個例子,輸入數據可能看起來像:[(1,125.50),(2,30.00),(1,24.50),(1,-25.00),(2,20.00)]

而且我所要的輸出是這樣的:

[(1,125.00),(2,50.00)]

我讀過,人們剛剛其它問題想要使用sum(i,i,j在a中)的形式添加元組的第二個元素的值,但是這確實將它們與第一個元素分開。

這個討論,python sum tuple list based on tuple first value,它將值作爲分配給每個鍵(cust_id)的列表放在字典中。我想我可以弄清楚如何在列表中添加每個值?

有關更好的方法的任何想法?

預先感謝您。

回答

2
import collections 

def total(records): 
    dct = collections.defaultdict(int) 
    for cust_id, contrib in records: 
     dct[cust_id] += contrib 

    return dct.items() 
+0

答案中的代碼最適合我現有的代碼,餘額返回列表中,減少了進一步的處理。如果我需要查找,那麼我認爲@ beiller的解決方案將是最好的。 – 2015-02-25 13:05:06

+0

我非常欣賞其他人。在某個時候,我想試試Uri Goren's,因爲我想要改善我的單挑。 – 2015-02-25 13:06:48

1

下面的代碼會有用嗎?

in_list = [(1,125.50),(2,30.00),(1,24.50),(1,-25.00),(3,20.00)] 
totals = {} 
for uid, x in in_list : 
    if uid not in totals : 
     totals[uid] = x 
    else : 
     totals[uid] += x 

print(totals) 

輸出:

{1: 125.0, 2: 30.0, 3: 20.0} 
+0

我是這麼認爲的。讓我一起工作一下。我仍然有很多需要了解字典是如何工作的:-)。我會回來的。 – 2015-02-24 21:18:14

0

人們通常喜歡的俏皮話在Python:

[(uk,sum([vv for kk,vv in data if kk==uk])) for uk in set([k for k,v in data])] 

data=[(1,125.50),(2,30.00),(1,24.50),(1,-25.00),(3,20.00)] 

釷Ë輸出

[(1, 125.0), (2, 30.0), (3, 20.0)] 
1

下面是一個itertools解決方案:

from itertools import groupby 
>>> x 
[(1, 125.5), (2, 30.0), (1, 24.5), (1, -25.0), (2, 20.0)] 
>>> sorted(x) 
[(1, -25.0), (1, 24.5), (1, 125.5), (2, 20.0), (2, 30.0)] 
>>> for a,b in groupby(sorted(x), key=lambda item: item[0]): 
    print a, sum([item[1] for item in list(b)]) 
1 125.0 
2 50.0 
相關問題