【问题标题】:Create a nested Dictionary with two dictionaries使用两个字典创建嵌套字典
【发布时间】:2020-06-28 06:19:27
【问题描述】:

我有一个名为 multi: 的嵌套列表:

[[14, 77766 ,[2, 2]],
 [15, 77766,  [1, 2]],
 [70, 88866, [1, 5]],
 [71, 88866,[2, 5]],
 [72, 88866, [5, 5]],
 [73, 88866, [4, 5]],
 [74, 88866, [3, 5]],
 [79, 99966, [1, 2]],
 [80, 99966, [2, 2]]] 

我需要我的输出是:

{77766:  {14:2 ,15:1} , 88866: {70:1, 71:2, 72:5, 73:4, 74:3}, 99966: {79:1, 80:2}}

我编写了生成以下两个字典的代码。如何将它们结合起来以实现我想要的输出?

a = {77766: [14, 15], 88866: [70, 71, 72, 73, 74], 99966: [79, 80]}
b = {14: 2, 15: 1, 70: 1, 71: 2, 72: 5, 73: 4, 74: 3, 79: 1, 80: 2}

【问题讨论】:

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


    【解决方案1】:

    对于这个问题defauldict(dict)真的很方便。 通过传入 dict,您可以将空字典定义为默认值。这意味着:如果您尝试访问一个尚不存在的键,则会为该键创建一个空字典。

    res = defaultdict(dict)
    for inner_key, key, inner_value in multi:
        res[key].update({inner_key: inner_value[0]}) 
    

    请注意,您收到的是 defaultdict 而不是常规字典。如果您的用例需要后者,您可以使用:

    res = {}
    for inner_key, key, inner_value in multi:
        if key not in res:
            res[key] = {}
        res[key].update({inner_key: inner_value[0]})
    

    【讨论】:

      【解决方案2】:

      您可以在此处使用defaultdictmulti 不需要排序。

      from collections import defaultdict
      out=defaultdict(dict)
      for v,k,vs in multi:
          out[k]={**out[k],**{v:vs[0]}}
      

      输出

      defaultdict(dict,
                  {77766: {14: 2, 15: 1},
                   88866: {70: 1, 71: 2, 72: 5, 73: 4, 74: 3},
                   99966: {79: 1, 80: 2}})
      

      编辑

      对内部字典进行排序。

      out={k:dict(sorted(v.items(),key=lambda x:x[1])) for k,v in out.items()}
      

      输出:

      {77766: {15: 1, 14: 2},
       88866: {70: 1, 71: 2, 74: 3, 73: 4, 72: 5},
       99966: {79: 1, 80: 2}}
      

      【讨论】:

      • 已经做过 :) 快速问题,有没有我可以按值对嵌套字典进行排序?例如:{77766:{15:1 14:2}、88866:{70:1、71:2、74:3、73:4、72:5}、99966:{79:1、80:2} }
      • 不工作,map 应该在代码中的什么位置?
      【解决方案3】:

      1。合并您的字典

      a = {77766: [14, 15], 88866: [70, 71, 72, 73, 74], 99966: [79, 80]}
      b = {14: 2, 15: 1, 70: 1, 71: 2, 72: 5, 73: 4, 74: 3, 79: 1, 80: 2}
      
      c = {
          k: {
              i: b[i]
              for i in v
          }
          for k, v in a.items()
      }
      print(c)
      

      输出:

      {77766: {14: 2, 15: 1}, 88866: {70: 1, 71: 2, 72: 5, 73: 4, 74: 3}, 99966: {79: 1, 80: 2}}
      

      2。直接从原始字典构建结果字典

      data = [
          [14, 77766, [2, 2]],
          [15, 77766, [1, 2]],
          [70, 88866, [1, 5]],
          [71, 88866, [2, 5]],
          [72, 88866, [5, 5]],
          [73, 88866, [4, 5]],
          [74, 88866, [3, 5]],
          [79, 99966, [1, 2]],
          [80, 99966, [2, 2]],
      ]
      
      c = {}
      for key, id_, (value, _) in data:
          c.setdefault(id_, {})[key] = value
      print(c)
      

      输出:同上

      【讨论】:

      • 非常感谢!有没有我可以按值对嵌套字典进行排序?例如:{77766:{15:1 14:2}、88866:{70:1、71:2、74:3、73:4、72:5}、99966:{79:1、80:2} }
      【解决方案4】:

      假设您的输入列表按第二列排序,您可以使用itertools.groupby

      import itertools
      
      multi = [
          [14, 77766, [2, 2]],
          [15, 77766, [1, 2]],
          [70, 88866, [1, 5]],
          [71, 88866, [2, 5]],
          [72, 88866, [5, 5]],
          [73, 88866, [4, 5]],
          [74, 88866, [3, 5]],
          [79, 99966, [1, 2]],
          [80, 99966, [2, 2]],
      ]
      
      nested = {
          key: {l[0]: l[2][0] for l in lines}
          for key, lines in itertools.groupby(multi, lambda p: p[1])
      }
      

      输出

      {77766: {14: 2, 15: 1},
       88866: {70: 1, 71: 2, 72: 5, 73: 4, 74: 3},
       99966: {79: 1, 80: 2}}
      

      【讨论】:

      • 非常感谢!有没有我可以按值对嵌套字典进行排序?例如:{77766:{15:1 14:2}、88866:{70:1、71:2、74:3、73:4、72:5}、99966:{79:1、80:2} }
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2018-03-27
      • 1970-01-01
      • 2017-07-25
      • 2021-04-04
      • 2023-01-18
      相关资源
      最近更新 更多