Python3字典理解与子字典的困扰?

时间:2018-09-06 13:12:39

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

假设其中有一个字典ID NAME Age_Low Age_High 1 ABC 75 90 2 XYZ 50 20 ,该字典由key:value对组成,其中一些值本身就是字典。

一个人(如果可以的话,如何)可以通过字典理解来解包这些子词典?

例如

root

示例:

{k: v if type(v) is not dict else **v for k, v in root.items()}

3 个答案:

答案 0 :(得分:2)

我想我应该在发布答案时提供更广泛的解释,以帮助您,因为它与其他现有问题有些不同

{
    _k: _v
    for k, v in root.items()
    for _k, _v in (         # here I create a dummy dictionary if non exists
                      v if isinstance(v, dict) else {k: v}
                  ).items() # and iterate that
}

理解的关键部分是您需要一致且通用的逻辑才能理解。

您可以通过使用v if isinstance(v, dict) else {k: v}

创建 dummy 嵌套字典来实现,这些字典以前不存在

然后这是一个简单的嵌套字典解压缩练习。

为了帮助您将来理解,我建议例如将代码写出来。

res = dict()
for k,v in root.items():
    d = v if isinstance(v, dict) else {k: v}
    for _k, _v in d.items():
        res[_k] = _v

然后从此倒退

有用的参考

答案 1 :(得分:1)

如果您有多个级别的嵌套字典,建议您基于递归函数使用以下解决方案:

def flatten(res, root):
    for k,v in root.items():
        if isinstance(v, dict):
            flatten(res, v)
        else:
            res[k] = v

root = {'a': 1, 'b': {'c': 2, 'd': {'e': 5, 'f': 6}}}

result = {}
flatten(result, root)

print(result)  # {'a': 1, 'c': 2, 'e': 5, 'f': 6}

答案 2 :(得分:0)

这是一个递归解决方案。在函数_flatten_into_kv_pairs中,我们迭代键和值对,如果值不是字典,则产生这些键/值。如果是,那么我们将以_flatten_into_kv_pairs构造递归调用yield from。函数flatten_dict只是一个外壳,可将键/值对的序列转换回字典。

def _flatten_into_kv_pairs(dict_object):
    for k, v in dict_object.items():
        if isinstance(v, dict):
            yield from _flatten_into_kv_pairs(v)
        else:
            yield k, v


def flatten_dict(dict_object):
    return dict(_flatten_into_kv_pairs(dict_object))


root = {'a': 1, 'b': {'c': 2, 'd': 3, 'e': {'f': 4, 'g': 5}}}
print(flatten_dict(root))

输出:

{'a': 1, 'c': 2, 'd': 3, 'f': 4, 'g': 5}