首页 > 解决方案 > Python程序将输出作为嵌套字典计数

问题描述

我有以下格式的文件

Pid,Lid
2000,150
2000,450
2000,300
2000,150
3000,100
3000,250
3000,100

期望的输出

{'2000':{'150':2,'300':1,'450':1},'3000':{'100':2,'250':1}}

对于每个 Pid,我正在构建一个字典,其中 Pid 作为键,嵌套字典作为值。这个嵌套字典将 Lid 作为键,将其频率作为值。

frequency={}
for eachline in file:
    eachline =eachline .strip()
    Pid,Lid = eachline .split(',')
    if Pid in frequency:
        frequency[Pid][Lid]=frequency[Pid][Lid]+1
    else:
        frequency[Pid]={Lid :1}
print frequency

这是我正在尝试的代码,但它不起作用,请帮助

标签: pythondictionary

解决方案


您可以使用嵌套来存储计数,并使用 withcollections.defaultdict()读取.csvcsv.reader()文件:

from csv import reader
from collections import defaultdict
from pprint import pprint

# create nested defaultdicts
d = defaultdict(lambda: defaultdict(dict))

# open file with context manager
with open('pids.csv') as f:

    # create csv reader object
    csv_reader = reader(f)

    # skip headers
    next(csv_reader)

    # collect counts
    for pid, lid in csv_reader:
        d[pid][lid] = d[pid].get(lid, 0) + 1

pprint(d)

这给出了以下内容:

defaultdict(<function <lambda> at 0x7fcf5b8a7f28>,
            {'2000': defaultdict(<class 'dict'>,
                             {'150': 2,
                              '300': 1,
                              '450': 1}),
             '3000': defaultdict(<class 'dict'>, {'100': 2, '250': 1})})

collections.Counter()您还可以在子字典中使用 a 计数:

from csv import reader
from collections import defaultdict
from collections import Counter
from pprint import pprint

# create defaultdict of Counters
d = defaultdict(lambda: Counter())

# open file with context manager
with open('pids.csv') as f:

    # create csv reader object
    csv_reader = reader(f)

    # skip headers
    next(csv_reader)

    # collect counts
    for pid, lid in csv_reader:
        d[pid][lid] += 1

pprint(d)

这给出了以下内容:

defaultdict(<function <lambda> at 0x7f2b024b7f28>,
            {'2000': Counter({'150': 2, '450': 1, '300': 1}),
             '3000': Counter({'100': 2, '250': 1})})

注意: defaultdict() andCounter()只是 的子类dict,这意味着它们可以被视为普通字典。


推荐阅读