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

0 投票
2 回答
11115 浏览
提问于 2025-04-18 18:26

我有一个名为 "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

有没有办法做到这一点呢?

2 个回答

2

这是一个使用 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])
3

使用普通的 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) 这个操作其实是多余的,因为程序已经自动识别并去掉了结果中的表头。

撰写回答