【问题标题】:Creating a nested dictionary from a CSV file with Python使用 Python 从 CSV 文件创建嵌套字典
【发布时间】:2014-08-25 12:12:53
【问题描述】:

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

有没有办法做到这一点?

【问题讨论】:

    标签: python csv dictionary


    【解决方案1】:

    使用常规的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) 的调用是多余的,因为标头已被自动检测并从结果中删除。

    【讨论】:

      【解决方案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])
      

      【讨论】:

        猜你喜欢
        • 2021-03-04
        • 1970-01-01
        • 1970-01-01
        • 2017-07-25
        • 2021-02-20
        • 2022-11-05
        • 2012-08-26
        • 2021-08-13
        • 2019-09-15
        相关资源
        最近更新 更多