如何用sum函数在python中创建复杂的字典?

时间:2013-11-26 19:06:38

标签: python dictionary

基本上,我有一个看起来像这样的文件:

year gender marst  age   people  
A    'abc'    x    12    1000
B    'tex'    y    34    120 
B    'tex'    x    78    1300
E    'yet'    x    88    1400
A    'abc'    y    22    150
A    'abc'    x    22    1600

我需要创建一个如下所示的复杂字典:

complete_dict = {A:{'abc':{x:2600,y:150}}, 
                 B:{'tex':{x:1300,y:120}}, 
                 E:{'yet':{x:1400}}}

我尝试过的是

import csv
import numpy as np

d={}

for row in reader:
    c=row['year']
    values = [row['age'], row['people']]
    s = row['gender']
    t = row['marst']
    if c not in d: 
        d[c]={}
    if s not in d[c]: 
        d[c][s] = {}    
    if t not in d[c][s]:
        d[c][s][t]= []
        d[c][s][t].append(values)
print d

所以我可以得到结果

complete_dict = {A:{'abc':{x:[[12,1000],[22,1600]] ,y:[22,150]}}, 
                 B:{'tex':{x:[78,1300],y:[34,120]}}, 
                 E:{'yet':{x:[88,1400]}}}

我尝试使用append(sum(values))代替append(values),但收到了错误。

2 个答案:

答案 0 :(得分:1)

from collections import defaultdict


def factory():
    return defaultdict(lambda:defaultdict(int))

d = defaultdict(factory)

txt = """A    'abc'    x    12    0.001
B    'tex'    y    34    0.002  
B    'tex'    x    78    0.005
E    'yet'    x    88    0.090
A    'abc'    y    22    0.120
A    'abc'    x    22    0.120"""
for line in txt.splitlines():
    words = line.split()
    d[words[0]][words[1]][words[2]] += 1

答案 1 :(得分:0)

根据要求的外观,您不需要在最嵌套的字典中使用列表。您似乎想要计算不同“主要”条目的出现次数。这意味着您需要替换上一个if:

if t not in d[c][s]:
    d[c][s][t] = 1
else:
    d[c][s][t] += 1