使用Python从CSV文件创建嵌套字典

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Python从CSV文件创建嵌套字典相关的知识,希望对你有一定的参考价值。

我有一个csv文件“input.csv”,它有以下数据。

UID,BID,R
U1,B1,4
U1,B2,3
U2,B1,2

我希望上面看起来像下面的字典;按UID分组为键,BID和R为嵌套字典值。

{"U1":{"B1":4, "B2": 3}, "U2":{"B1":2}}

我有以下代码:

new_data_dict = defaultdict(str)
with open("input.csv", 'r') as data_file:
    data = csv.DictReader(data_file, delimiter=",")
    headers = next(data)
    for row in data:
        new_data_dict[row["UID"]] += {row["BID"]:int(row["R"])}

以上抛出一个明显的错误

TypeError: cannot concatenate 'str' and 'dict' objects

有没有办法做到这一点?

答案

使用常规dict(),您可以使用get()初始化一个新的子字典并在之后填充它。

import csv

new_data_dict = {}
with open("data.csv", 'r') as data_file:
    data = csv.DictReader(data_file, delimiter=",")
    for row in data:
        item = new_data_dict.get(row["UID"], dict())
        item[row["BID"]] = int(row["R"])

        new_data_dict[row["UID"]] = item

print new_data_dict

此外,您对next(data)的调用是多余的,因为标题会被自动检测并从结果中删除。

另一答案

这是使用defaultdict的更高效的版本:

from collections import defaultdict

new_data_dict = {}
with open("input.csv", 'r') as data_file:
    data_file.next()
    for row in data_file:
        row = row.strip().split(",")
        new_data_dict.setdefault(row[0],{})[row[1]] = int(row[2])

以上是关于使用Python从CSV文件创建嵌套字典的主要内容,如果未能解决你的问题,请参考以下文章

Python Killed: 9 在使用从 2 个 csv 文件创建的字典运行代码时

从 CSV 文件创建字典

从 CSV 数据流 python 创建一个字典

Python:将嵌套字典写入 CSV

如何使用 python 从 XML 创建嵌套字典?

如何从 2 个 pkl 文件创建 Python 嵌套字典/将 2 个嵌套字典合并为一个?