通过dict dict的dict计算值

时间:2014-03-17 08:48:59

标签: python dictionary counting

我有以下数据:

foo red test
foo red test
foo red test2
foo blue test
bar red test
bar blue test
bar red test2
bar red test2

我想要做的是计算上面的值,从而得到这本字典词典词典:

{
   'bar' : {
              'blue' : {
                          'test': 1
                        },
               'red' : {
                          'test' : 1,
                          'test2': 2
                        }
                   },
          'foo' : {
                     'blue' : {
                                 'test' : 1
                               },
                     'red' => {
                                'test' : 2,
                                'test2' : 1
                              }
                   }
        }

为什么以下代码失败(我正在使用Python 2.6.2)

from collections import defaultdict
dictfinal = defaultdict(lambda: defaultdict(dict))
with open('myfileabove.txt','r') as tsvfile:
    csvreader = csv.reader(tsvfile,delimiter=' ')
    for rw in csvreader:
        val1 = rw[0]
        val2 = rw[1]
        val3 = rw[2]
        dictfinal[val1][val2][val3] +=1

在Perl中可以这样做: https://eval.in/121318

2 个答案:

答案 0 :(得分:3)

将dict定义更改为:

dictfinal = defaultdict(lambda: defaultdict(lambda: defaultdict(int)))

答案 1 :(得分:0)

作为补充,我建议使用单个字典而不是嵌套字典。如果向csv添加列,它会更好地扩展。

from collections import Counter

a = """foo red test
foo red test
foo red test2
foo blue test
bar red test
bar blue test
bar red test2
bar red test2"""

b = Counter(tuple(s.split()) for s in a.splitlines())

# Counter({('foo', 'red', 'test'): 2, ('bar', 'red', 'test2'): 2, ('bar', 'blue', 'test'): 1, ('foo', 'blue', 'test'): 1, ('foo', 'red', 'test2'): 1, ('bar', 'red', 'test'): 1})