Python:向字典键添加多个值

时间:2015-09-05 12:57:45

标签: python dictionary key

我想从csv文件中读取一系列值,按唯一键排列,然后对值进行一些计算。因此,我想到了字典 - 我可以获得第一个值,但是在向同一个键附加第二个值时遇到了问题。

钥匙将是第一个入口;即三个字母,要存储的第一个值将是第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,却无法使用它。任何有关正确方向的建议或提示都将不胜感激。

3 个答案:

答案 0 :(得分: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]})

答案 1 :(得分: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]}

答案 2 :(得分: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})