[英]Creating a nested dictionary from a CSV file with Python with 2 levels
我正在努力将 csv 导入到嵌套字典。 我找到了一个对我来说几乎完美的例子:
UID,BID,R
U1,B1,4
U1,B2,3
U2,B1,2
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
就我而言,我还有一层嵌套要做。 我的数据看起来像:
FID,UID,BID,R
A1,U1,B1,4
A1,U1,B2,3
A1,U2,B1,2
A2,U1,B1,4
A2,U1,B2,3
A2,U2,B1,2
结果应该是:
{"A1":{"U1":{"B1":4, "B2": 3}, "U2":{"B1":2}},
"A2":{"U1":{"B1":4, "B2": 3}, "U2":{"B1":2}}}
我必须如何完成和更正上面发布的代码?
谢谢,托比
使用以递归方式将自身定义为默认字典的collections.defaultdict
,嵌套级别非常容易。
这个自包含的示例(不是使用文件而是使用行列表)演示了它:
import collections
import csv,json
data_file="""FID,UID,BID,R
A1,U1,B1,4
A1,U1,B2,3
A1,U2,B1,2
A2,U1,B1,4
A2,U1,B2,3
A2,U2,B1,2
""".splitlines()
def nesteddict():
return collections.defaultdict(nesteddict)
new_data_dict = nesteddict()
data = csv.DictReader(data_file, delimiter=",")
for row in data:
new_data_dict[row["FID"]][row["UID"]][row["BID"]] = row["R"]
# dump as json to have a clean, indented representation
print(json.dumps(new_data_dict,indent=2))
结果:
{
"A1": {
"U1": {
"B1": "4",
"B2": "3"
},
"U2": {
"B1": "2"
}
},
"A2": {
"U1": {
"B1": "4",
"B2": "3"
},
"U2": {
"B1": "2"
}
}
}
“魔法”线是这样的:
def nesteddict():
return collections.defaultdict(nesteddict)
每次在字典中缺少键时调用nesteddict
,这会创建一个具有相同属性的默认字典(在旧的StackOverflow 答案中看到: Nested defaultdict of defaultdict )
然后创建关卡或更新它们只需:
new_data_dict[row["FID"]][row["UID"]][row["BID"]] = row["R"]
如果你想要简单,你可以试试这个:
import csv
new_data_dict = {}
with open("data.csv", "r") as data_file:
data = csv.DictReader(data_file, delimiter=",")
for row in data:
if row["R"] != "R":
item = new_data_dict.get(row["UID"], dict())
item[row["BID"]] = int(row["R"])
temp_dict = new_data_dict.get(row["FID"], dict())
if row["UID"] in temp_dict:
temp_dict[row["UID"]].update(item)
else:
temp_dict[row["UID"]] = item
new_data_dict[row["FID"]] = temp_dict
print new_data_dict
我只是在分配给new_data
之前添加了一个名为temp_dict
的新字典,以便可以保留以前的值。
结果:
{'A1': {'U1': {'B1': 4, 'B2': 3}, 'U2': {'B1': 2}}, 'A2': {'U1': {'B1': 4, 'B2': 3}, 'U2': {'B1': 2}}}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.