【问题标题】:How to append lists in nested dictionary in Python如何在 Python 中的嵌套字典中追加列表
【发布时间】:2021-08-04 19:19:25
【问题描述】:

我有 2 个嵌套字典:

 grouped1 ={'LabelStat': { 'Carrier': ['1', '1'],
                           'FormID': ['0201', '0430']},
          
             'McAfee': {'DatDate': 'Not Available',
            '            DatVersion': 'Not Available'}
           }
    
    
 grouped2 ={'LabelStat': {'Carrier': ['2', '2'],
                          'FormID': ['10201', '10430']},
         'McAfee': {'DatDate': 'Available',
            'DatVersion': 'Available',}
           }

我想附加这两个字典,输出应该是这样的:

com_grouped = {
    'LabelStat': {'Carrier': ['1', '1','2','2'],
                   'FormID': ['0201', '0430','10201', '10430']}
             
    'McAfee': {'DatDate': ['Not Available','Available']
               'DatVersion': ['Not Available','Available']}
    
             }

第一次尝试:

com_grouped = grouped1.update(grouped2)
print(com_grouped)

而且没有输出。

然后我累了:

com_grouped = grouped1
com_grouped=com_grouped.update(grouped2)
print(com_grouped)

输出还是没有!

【问题讨论】:

  • 使用嵌套循环。
  • StackOverflow 不是免费的编码服务。你应该try to solve the problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :)
  • 是的,先生,我同意你的看法,会更新,谢谢你的提醒!
  • 嗨@Barmar,我刚刚编辑了我的问题,请给我一些建议,非常感谢!

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


【解决方案1】:

你可以使用递归collections.defaultdict:

from collections import defaultdict
import re
def merge(*d):
   v = defaultdict(list)
   for i in d:
      for a, b in i.items():
         v[re.sub('^\s+', '', a)].append(b)
   return {a:merge(*b) if all(isinstance(j, dict) for j in b) 
            else [i for j in b for i in (j if isinstance(j, list) else [j])] 
              for a, b in v.items()}

print(merge(grouped1, grouped2))

输出:

{'LabelStat': {'Carrier': ['1', '1', '2', '2'], 'FormID': ['0201', '0430', '10201', '10430']}, 'McAfee': {'DatDate': ['Not Available', 'Available'], 'DatVersion': ['Not Available', 'Available']}}

【讨论】:

  • 您好先生,谢谢您的回复,但是当我运行它时,DatVersion 的输出是这样的: DatVersion': ['Not Available'], 'DatVersion': ['Available'] }} 不合并,你能帮我检查一下真的很感激!
  • @William 那是因为grouped1DatVersion 前面有多余的空格:' DatVersion'。您可以调整您的原始输入或使用我的编辑版本,从键中去除这个前导空格
  • 是的,它有效!非常感谢您的帮助和知识!
  • 嘿@Ajax1234,您是否介意在不使用复杂列表和字典理解的情况下添加一个对新手更友好的解决方案版本?我相信如果它更具可读性,人们可以更好地理解它。
  • 嗨@Ajax1234 你能帮我解决这个问题吗stackoverflow.com/questions/67576668/…
【解决方案2】:

您可以将 2 dict 与 update() 方法合并:

grouped1 = {'LabelStat': {'Carrier': ['1', '1'],
                          'FormID': ['0201', '0430']},

            'McAfee': {'DatDate': 'Not Available',
                       '            DatVersion': 'Not Available'}
            }

grouped2 = {'LabelStat': {'Carrier': ['2', '2'],
                          'FormID': ['10201', '10430']},
            'McAfee': {'DatDate': 'Available',
                       'DatVersion': 'Available', }
            }
com_grouped = grouped1
com_grouped.update(grouped2)

输出:

{'LabelStat': {'Carrier': ['2', '2'], 'FormID': ['10201', '10430']}, 'McAfee': {'DatDate': 'Available', 'DatVersion': 'Available'}}

【讨论】:

  • 感谢您的回复,如果我有 10 个字典需要更新怎么办?
  • 据我所知,您可以在该操作中使用循环。或使用此代码(如果您拥有所有字典名称):merged = {**dict1, **dict2,**dict3,**dict4,**dict5,**dict6,**dict7,**dict8,**dict9,**dict10 }.
【解决方案3】:
d = {}
d.setdefault("a", []) = 1
d.setdefault("a", []) = 2
d

输出: {"a":[1, 2]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多