我有一个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
有办法做到这一点吗?
答案 0 :(得分: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)
的调用是多余的,因为标题会自动检测并从结果中删除。
答案 1 :(得分: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])