我有一个包含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}}}
但我不确定嵌套字典是不是一个好选择。如果是的话,我很难实现"计数器"部分。
答案 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}}}