【问题标题】:Python creating nested dictionary from a List with repeating keysPython从具有重复键的列表创建嵌套字典
【发布时间】:2020-06-30 20:40:54
【问题描述】:

我正在尝试将列表转换为字典。 我有一个这样的列表列表,并且迷你列表的一些第一个值正在重复:

list = [["DDS 500","A",300], ["DDS 500","B",100], ["AGB 850","C",250], ["AGB 850","B",350], ["UNI 100","D",900]]

迷你列表的第一个值将是 key 。然后,对于每个迷你列表,第二个和第三个值将是该键的“值”,并且值也应该是一个字典。结果,最终字典应该是这样的:

dict = { "DDS 500":{"A":300,"B":100}, "AGB 850":{"C":250,"B":350}, "UNI 100":{"D":900} }

【问题讨论】:

  • 您是否尝试过解决此问题?你到底在坚持什么?
  • 我尝试创建字典,但由于列表中的某些值重复,所以只给字典先看到的值。例如,`dict = {"DDS 500: {"A": 300}, ..`@jordanm

标签: python python-3.x string list dictionary


【解决方案1】:

您可以使用collections.defaultdict

from collections import defaultdict

lst= [["DDS 500","A",300], ["DDS 500","B",100], ["AGB 850","C",250], ["AGB 850","B",350], ["UNI 100","D",900]]

out=defaultdict(dict)

for k,ik,iv in lst:
    out[k].update({ik:iv})

输出:

defaultdict(dict,
            {'DDS 500': {'A': 300, 'B': 100},
             'AGB 850': {'C': 250, 'B': 350},
             'UNI 100': {'D': 900}})

【讨论】:

    【解决方案2】:

    如果您不想导入任何模块,可以使用dict.setdefault

    result = {}
    
    for k1, k2, v in my_list:
        result.setdefault(k1, {})[k2] = v
    result
    

    输出:

    {'DDS 500': {'A': 300, 'B': 100},
     'AGB 850': {'C': 250, 'B': 350},
     'UNI 100': {'D': 900}}
    

    【讨论】:

      【解决方案3】:

      您可以分两步完成:1) 创建包含所有键和空字典作为值的字典,2) 将值作为字典合并到每个键中:

      lst = [["DDS 500","A",300], ["DDS 500","B",100], ["AGB 850","C",250], ["AGB 850","B",350], ["UNI 100","D",900]]
      
      d = { k:dict() for k,*_ in lst }
      for k,*v in lst: d[k].update(dict([v]))
      

      输出:

      print(d)
      
      # {'DDS 500': {'A': 300, 'B': 100}, 'AGB 850': {'C': 250, 'B': 350}, 'UNI 100': {'D': 900}}
      

      【讨论】:

        猜你喜欢
        • 2019-02-21
        • 2020-01-23
        • 1970-01-01
        • 1970-01-01
        • 2016-07-09
        • 1970-01-01
        • 1970-01-01
        • 2018-08-22
        • 2021-09-04
        相关资源
        最近更新 更多