Python:为字典键添加多个值

问题描述:

我想从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

根据你想要什么,你不是存储列表中,当你做 -

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

很高兴我们会对您有所帮助。我还想要求您接受答案(通过点击答案左侧的勾号),答案是最有帮助的。 –

这样的事情?

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]} 

我建议使用一个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})