在嵌套字典中实现计数器

时间:2017-11-01 18:52:09

标签: python csv

我有一个包含3列的.csv文件,让'说a,b,c,c代表时间,可以有00-24的值。

我想浏览此文件并提取唯一的a,b,c并计算特定c的出现次数。例如,如果文件如下所示:

a1 b1 c1

a1 b1 c1

a1 b1 c1

a1 b1 c2

a1 b1 c2

a1 b2 c1

a1 b2 c1

a2 b1 c1

a2 b1 c2

我想创建这样的东西:

{a1:{b1:{c1:3, c2:2},b2:{c1:2}},a2:{b1:{c1:1,c2:1}}}

但我不确定嵌套字典是不是一个好选择。如果是的话,我很难实现"计数器"部分。

1 个答案:

答案 0 :(得分:1)

您仍然可以使用Counter进行计数:

rows = [
    ('a1', 'b1', 'c1'),
    ('a1', 'b1', 'c1'),
    ('a1', 'b1', 'c1'),
    ('a1', 'b1', 'c2'),
    ('a1', 'b1', 'c2'),
    ('a1', 'b2', 'c1'),
    ('a1', 'b2', 'c1'),
    ('a2', 'b1', 'c1'),
    ('a2', 'b1', 'c2'),
]

from collections import Counter

counts = Counter(rows)

至于将数据结构更改为嵌套字典,可以使用setdefault使用普通字典执行此操作,也可以实现"autovivificious"字典并使用:

class AutoViv(dict):
    def __missing__(self, key):
        value = self[key] = type(self)()
        return value

nested = AutoViv()
for row, count in counts.iteritems():
    nested[row[0]][row[1]][row[2]] = count

这符合您想要的结果:

>>> nested
{'a1': {'b1': {'c2': 2, 'c1': 3}, 'b2': {'c1': 2}}, 'a2': {'b1': {'c2': 1, 'c1': 1}}}