2015-09-05 319 views
1

我想從csv文件中讀取一系列值,按唯一鍵排列,然後對值進行一些計算。所以字典會讓人浮想聯翩 - 我可以獲得第一個值,但是在將同一個鍵附加第二個值時遇到問題。Python:爲字典鍵添加多個值

該鍵將是第一個條目;即三個字母,要存儲的第一個值將是第2列和第3列中的值的累積相加,第二個要存儲的值將是第3列的累積值。因此,基於以下文件,我希望詞典閱讀:

文件:

AAA,12.0,2 

BBB,14.0,4 

AAA,15.5,1 

輸出:

AAA:30.5,3 
BBB:16.0,4 

示例代碼:

import csv 

with open('input.csv') as csv_input: 

    read_csv = csv.reader(csv_input) 
    values = {} 

    for row in read_csv: 

     try: 
      values[row[0]] += float(row[1]) + float(row[2]) 

     except KeyError: 

      try: 
       values[row[0]] = float(row[1]) + float(row[2]) 
       #values.setdefault([row[0]]).append((row[2])) 

      except ValueError: 

       pass 
print values 

我試過使用.append但無法讓它工作。任何意見或正確方向的提示將不勝感激。

+0

'值[行[0]] = values.get(行[0],[])追加(浮(row [1])+ float(row [2]))' – alfasin

回答

0

根據你想要什麼,你不是存儲列表中,當你做 -

values[row[0]] = float(row[1]) + float(row[2]) 

你應該創建兩個元素的列表,第一個元素是加row[1]row[2],第二個是row[2]

我也建議你可以在這裏使用collections.defaultdict,並提供一個函數,返回一個從0開始的兩個元素的列表。

示例 -

import csv 
from collections import defaultdict 

with open('input.csv') as csv_input: 
    read_csv = csv.reader(csv_input) 
    values = defaultdict(lambda : [0,0]) 
    for row in read_csv: 
     values[row[0]][0] += float(row[1]) + float(row[2]) 
     values[row[0]][1] += float(row[2]) 
print values 

示例/演示 -

>>> import csv 
>>> from collections import defaultdict 
>>> 
>>> with open('a.csv') as csv_input: 
...  read_csv = csv.reader(csv_input) 
...  values = defaultdict(lambda : [0,0]) 
...  for row in read_csv: 
...   values[row[0]][0] += float(row[1]) + float(row[2]) 
...   values[row[0]][1] += float(row[2]) 
... 
>>> print(values) 
defaultdict(<function <lambda> at 0x005B3B70>, {'AAA': [30.5, 3.0], 'BBB': [18.0, 4.0]}) 
+0

謝謝Anand,非常感謝。 –

+0

也感謝所有貢獻的人。 –

+0

很高興我們會對您有所幫助。我還想要求您接受答案(通過點擊答案左側的勾號),答案是最有幫助的。 –

0

這樣的事情?

import csv 

with open('input.csv') as csv_input: 

    read_csv = csv.reader(csv_input) 
    values = {} 

    for row in read_csv: 

     key = row[0] 
     a = float(row[1]) + float(row[2]) 
     b = float(row[2]) 

     try: 
      values[key][0] += a 
      values[key][1] += b 

     except KeyError: 

      try: 
       values[key] = list(range(2)) 
       values[key][0] = a 
       values[key][1] = b 

      except ValueError: 
       pass 

print(values) # {'AAA': [30.5, 3.0], 'BBB': [18.0, 4.0]} 
0

我建議使用一個collections.defaultdict而不是常規字典:

from collections import defaultdict 
import csv 

sums = defaultdict(float) 
with open('input.csv', 'rb') as input_file: 
    for row in csv.reader(input_file): 
     sums[row[0]] += sum(float(elem) for elem in row[1:]) 

print(sums) # -> defaultdict(<type 'float'>, {'AAA': 30.5, 'BBB': 18.0})