我在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"
}
答案 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)