繁体   English   中英

使用具有 2 个级别的 Python 从 CSV 文件创建嵌套字典

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM