如何(或者有可能)使用列表来提取Python中的嵌套字典?

时间:2018-10-19 14:20:10

标签: python dictionary nested

我在Python中有一个这样的字典:

d = {
    "k1": "v1",
    "k2": {
        "nk1": "v2"
    },
    "k3": "v3"
}

我有一个列表,其中存储了要提取的键,其中一些是嵌套键:

extract = ["k1", "nk1", "k3"]

或者我可以用这种方式定义它来显示nk1嵌套在k2中,并且我不需要“ k2”值,因为它只是一个嵌套字典:

extract = ["k1", ["k2", "nk1"], "k3"]

有没有办法遍历这个extract列表并获取我需要的所有值,或者有没有更简单的方法来检查嵌套字典中是否存在键?

理想的输出是字典:

r = {
    "k1": "v1",
    "nk1": "v2",
    "k3": "v3"
}

3 个答案:

答案 0 :(得分:2)

您可以使用functools.reduce获取由给定键列表指定的值:

from functools import reduce
dict((k[-1], reduce(dict.get, k, d)) if isinstance(k, list) else (k, d[k]) for k in extract)

给出示例输入,将返回:

{'k1': 'v1', 'nk1': 'v2', 'k3': 'v3'}

答案 1 :(得分:1)

,我们可以在此处使用递归:

def linearize(some_dict):
    result = {}
    def lin(subdic):
        for k, v in subdic.items():
            if isinstance(v, dict):
                lin(v)
            else:
                result[k] = v
    lin(some_dict)
    return result

这将产生:

>>> linearize(d)
{'k1': 'v1', 'nk1': 'v2', 'k3': 'v3'} 

但是请注意,由于在使用子字典的情况下,相应的键是“忽略的”,因此这意味着我们“丢失了信息”以重建原始词典。

如果多个子词典包含相同的键,则将使用最后一个的值。因此结果字典可能包含比原始字典的(子)字典少 个键值项。

编辑:您还可以按照以下步骤进行提取:

def extract(some_dict, to_extract):
    result = {}
    def ext(ky):
        if isinstance(ky, str):
            ky = (ky,)
        subd = some_dict
        for k in ky:
            subd = subd[k]
        result[k] = subd
    for ky in to_extract:
        ext(ky)
    return result

然后我们获得:

>>> extract(d, ["k1", ["k2", "nk1"], "k3"])
{'k1': 'v1', 'nk1': 'v2', 'k3': 'v3'}

答案 2 :(得分:0)

这应该可以解决问题:

d = {
    "k1": "v1",
    "k2": {
        "nk1": "v2"
    },
    "k3": "v3"
}
extract = ["k1", "nk1", "k3"]

def get_possibly_nested_key(k, d):
    # k = key
    # d = dict
    if isinstance(k, list) and len(k) > 1:
        return get_possibly_nested_key(k[1:], d[k[0]])
    else:
        if isinstance(k, list):
            return d[k[0]]
        return d[k]

result = [get_possibly_nested_key(e, d) for e in extract]
print(result)