字典的扁平化引发 AttributeError

Posted

技术标签:

【中文标题】字典的扁平化引发 AttributeError【英文标题】:Flattening of dictionary of dictionaries raises AttributeError 【发布时间】:2021-12-08 12:55:02 【问题描述】:

我有一本字典:

dict1 = 
    'conf1' : 'subconf11' : True, 'subconf12' : False, 
    'conf2' : False, 
    'conf3' : 'subconf31' : True, 'subconf32' : False, 'subconf33' : False, 
    'conf4' : 'On'

我想将它展平为一个元组列表,这样:

list1 = [
    ('conf1',('subconf11',True)),
    ('conf1',('subconf12',False)),
    ('conf2',False),
    ('conf3',('subconf31',True)),
    ('conf3',('subconf32',False)),
    ('conf3',('subconf33',False)),
    ('conf4','On')
]

我尝试了类似的方法:

primary_conf_list = list(dict1.keys())
list2 = [(i,list[dict1[i].items()]) for i in primary_conf_list]

但可以理解的是,对于那些值不是字典而是布尔值或字符串值的人来说,它会给我带来错误。例如dict1['conf2']dict1['conf4']

这是确切的错误消息:

AttributeError: 'bool' object has no attribute 'items'

请帮助我实现这一目标。

【问题讨论】:

您需要嵌套循环来为嵌套字典中的每个元素创建一个元组。 【参考方案1】:

您应该检查该值是否为字典。如果是,请使用嵌套循环将元素添加到每个项目的结果中。

list2 = []
for key, val in dict1.items():
    if isinstance(val, dict):
        for subkey, subval in val.items():
            list2.append((key, (subkey, subval)))
    else:
        list2.append(key, val)

【讨论】:

@Barmer 谢谢你,这就是我想要的。据我所知,一个问题是isinstance(val, dict)type(val) is dict 在行为上有何不同。我见过 type() 匹配不起作用的情况(尤其是 cpython 场景)。但 isinstance() 几乎适用于所有实际用途。 isinstance() 将适用于子类,例如defaultdict @Barmer 您能否将您的答案转换为递归代码,用于字典词典。例如subconf31 可以是字典本身。例如:'subconf31' : 'subconf311' : 'subconf3111' : True, 'subconf31112' : False, 'subconf312' : True

以上是关于字典的扁平化引发 AttributeError的主要内容,如果未能解决你的问题,请参考以下文章

Python [练习题] :字典扁平化

Python [习题] 字典扁平化

我怎样才能扁平化一个字典列表?

扁平化处理字典

从扁平字典创建嵌套字典

使用 pandas json_normalize 扁平化包含多个嵌套列表的字典列表