Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python从CSV文件创建嵌套字典_Python_Csv_Dictionary - Fatal编程技术网

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

使用Python从CSV文件创建嵌套字典,python,csv,dictionary,Python,Csv,Dictionary,我有一个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.DictRea

我有一个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()
初始化一个新的子dict,然后填充它

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)
的调用是多余的,因为头被自动检测并从结果中剥离。

使用常规的
dict()
可以使用
get()
初始化新的子dict,然后填充它

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])

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