首页 > 解决方案 > 将多列 csv 文件读取到嵌套字典

问题描述

我正在尝试从 csv 文件中读取数据并将数据存储在嵌套字典中。

CSV file content

Type, ID, Frequency
Advanced,AAA,30 secs
Advanced,AAA,60 secs
Advanced,BBB,30 secs
Basic,CCC,30 secs
Basic,CCC,60 secs
Basic,DDD,30 secs

Expected output where the 'type' is the higher level key with the values as another dictionary with the ID and frequency as the key/value pair.

{'Advanced': {'AAA':['30 secs', '60 secs'], 'BBB':['30 secs']}, 'Basic': {'CCC':['30 secs', '60 secs'], 'DDD':['30 secs']}}

通过两列,我可以使用 defaultdict 容器来工作。

symbols = co.defaultdict(list)
with open(filename, 'r') as f:
    lines = csv.DictReader(f)
    for line in lines:
        print(line)
        symbols[line['Type']].append(line['ID'])

标签: pythondictionary

解决方案


您可以dict.setdefault改用:

symbols = {}
with open(filename, 'r') as f:
    for row in csv.DictReader(f, skipinitialspace=True):
        symbols.setdefault(row['Type'], {}).setdefault(row['ID'], []).append(row['Frequency'])

symbols变成:

{'Advanced': {'AAA': ['30 secs', '60 secs'], 'BBB': ['30 secs']}, 'Basic': {'CCC': ['30 secs', '60 secs'], 'DDD': ['30 secs']}}

或者,如果您更喜欢使用collections.defaultdict,则应改为创建symbolsofdefaultdict列表defaultdict

symbols = defaultdict(lambda: defaultdict(list))
for row in csv.DictReader(f, skipinitialspace=True):
    symbols[row['Type']][row['ID']].append(row['Frequency'])

推荐阅读