通过标准迭代总结值并存储到字典

时间:2014-03-17 06:47:55

标签: python dictionary

我有以下数据:

foo a 199
foo b 200
foo c 300
foo a 103
foo b 400
foo c 120
bar a 100
bar b 100
bar c 100

我想得到的是一个如下字典:

{foo:{a:302,   # 199 + 103
      b:600,   # 200 + 400
      c:420,}, # 300 + 120
 bar:{a:100,
      b:100,
      c:100}}

我坚持使用这段代码:

import csv
from collections import defaultdict

outerdict = defaultdict(dict)
with open('myinputabove.txt','r') as tsvfile:
    tabheader = csv.reader(tsvfile,delimeter=" ")
    for row in tabheader:
        val1 = row[0]
        val2 = row[1]
        val3 = row[2]
        outerdict[val1][val2] += val3

2 个答案:

答案 0 :(得分:2)

你走在正确的道路上。对代码进行一些修改可以解决问题。

  • 使用csv模块解析时,每个元素都是一个字符串。那么你 在添加之前必须将val3转换为int。
  • 你必须处理在向内心字典添加元素时可能出现的KeyError

以下代码有效:

outerdict = defaultdict(dict)
with open('file.txt','r') as tsvfile:
    tabheader = csv.reader(tsvfile, delimiter=" ")
    for row in tabheader:
        val1 = row[0]
        val2 = row[1]
        val3 = row[2]
        try:
            outerdict[val1][val2] += int(val3)
        except KeyError:
            outerdict[val1][val2] = int(val3)

答案 1 :(得分:1)

outerdict[val1]即使dict为false,也会是val1 in outerdict,因为outerdictdefaultdict。但如果outerdict[val1][val2]为false,val2 in outerdict[val1]可能会导致关键错误,因为outerdict[val1]只是dict,而不是defaultdict

尝试outerdict = defaultdict(lambda: defaultdict(int))

或者,如果您对结果看起来像这样:

{
    ('foo', 'a'): 302,
    ('foo', 'b'): 600,
    ('foo', 'c'): 420,
    ('bar', 'a'): 100,
    ('bar', 'b'): 100,
    ('bar', 'c'): 100
}

您可以使用outerdict = defaultdict(int)outerdict[val1,val2] += val3