【问题标题】:I want to clean a nested dictionary python using dictionary comprehension or for loops我想使用字典理解或 for 循环来清理嵌套字典 python
【发布时间】:2021-10-03 09:42:54
【问题描述】:

我有一个嵌套字典,其中包含一系列键 Dictionary_ABC = {'ABC 1':..., 'ABC 2': ..., ..., 'ABC N':...}。这些键中的每一个都包含与 ABC 键无关的随机值,但也包含与 ABC 键相关的其他值。例如:

Dictionary_ABC['ABC 1'] = {'ABC 1': {'ZYZZ': NONE, 'DAFDZ': NONE, 'EASDF': NONE, 'ABC 1': NONE, ..., 'ABC N': NONE}}

在子字典“ABC 1”中,我想删除所有不包含“ABC 1”的 ABC 值。所以最终的结果应该是这样的:

Dictionary_ABC['ABC 1'] = {'ABC 1': {'ZYZZ': NONE, 'DAFDZ': NONE, 'EASDF': NONE, 'ABC 1': NONE}}

所有其他 ABC # 都应该脱落,我只剩下其他子键和与主键匹配的子键。

我尝试了许多不同的解决方案,但似乎产生最接近结果的一个是:

Dictionary_ABC_Copy = {}
for key in Dictionary_ABC:
   for subkey in Dictionary_ABC[key]:
       if this criteria met:
           if this next criteria met:
                pass #I don't want to copy this
           else:
                Dictionary_ABC_Copy[key] = subkey #copy if it doesn't fit both criteria
        else:
            Dictionary_ABC_Copy[key] = subkey #because I want to copy this
       

条件产生了必要的结果,但是每当我尝试更新字典或使用上述方法时,字典都会覆盖所有以前的值。如果它们没有传递给过滤条件,我只想用这些值更新键。这是我的第一个问题。

我的第二个问题是有更好的方法吗?我希望我已经提供了帮助回答这些问题的必要信息。

谢谢。

【问题讨论】:

    标签: python python-3.x dictionary dictionary-comprehension


    【解决方案1】:

    我想你想要这样的东西:

    dictionary_abc_copy = {
       abc: {k: v for k, v in inner.items() if not k.startwith('ABC ') or k == abc}
       for abc, inner in dictionary_abc.items()
    }
    

    【讨论】:

    • 谢谢@Elazar,我只需稍作修改就能让它工作。非常感谢你,我很感激。
    • 修改了什么?
    • 我忘了提到有一个字典值不包含 ABC 和 #,这个我需要在每个键中。所以我修改它以解决这个问题: k.startswith('ABC') 和 re.findall(r'\d+', str(k)) 或者如果 re.findall(r'ABC \d+', str(k )) == re.findall(r'ABC \d+', str(abc))。这产生了必要的结果,包括在每个子词典中都有 ABC w/o。由于某种原因,使用 k == abc 对我不起作用。也许这是一个配置问题。但是 re.findall 能够解决这个问题。
    • 好的。如果答案解决了您的问题,请标记为已接受。
    猜你喜欢
    • 2019-02-03
    • 2021-06-03
    • 2017-03-09
    • 2015-10-13
    • 2016-06-08
    • 2021-07-24
    • 2013-07-28
    • 2011-06-06
    相关资源
    最近更新 更多