我有一个嵌套的字典,如下所示
entry = {
0: {"Q": 0},
1: {"W": 2, "E": 3, "N": 5, "S": 4, "Q": 0},
2: {
"N": {
"Q": {"E"}
}
},
}
当我尝试仅访问密钥1
的密钥时,得到以下信息:
>>> print(entry[1].keys())
dict_keys(['W', 'E', 'N', 'S', 'Q'])
但是对于键2,它仅返回顶部键,而不返回嵌套键。
>>> print(entry[2].keys())
dict_keys(['N'])
为什么它不返回字典的嵌套键?
答案 0 :(得分:2)
键()
返回字典键的新视图
您的嵌套字典是一个完全独立的字典,您可以使用自己的keys()
方法获取其自己的键:
entry[2]['N'].keys()
如果您想递归地获取嵌套字典中的所有键,则必须为此实现一个方法:
entry = {0: {"Q": 0},
1: {"W": 2, "E": 3, "N": 5, "S": 4, "Q": 0},
2: {"N": { "Q":{"E"}}},
}
def rec_keys(dictio):
keys = []
for (key,value) in dictio.items():
if isinstance(value, dict):
keys.extend(rec_keys(value))
else:
keys.append(key)
return keys
print(rec_keys(entry))
# ['Q', 'Q', 'W', 'N', 'S', 'E', 'Q']
答案 1 :(得分:1)
运行print(entry[2].keys())
您正在问python“与键'2'对应的数据中存在哪些键?(在您的情况下,这是另一本字典)”的答案只是'N'。这是因为
entry[2]
是
{"N": { "Q":{"E"}}
具有单个键“ N”和数据“ {“ Q”:{“ E”}}'
答案 2 :(得分:1)
dict.keys
仅返回字典的顶级键。如果要获取字典的所有嵌套键,则需要定义自己的函数。
# interface for dictionary-like objects
from collections.abc import Mapping
def nested_keys(d) -> set:
"""
Return a set containing all nested keys.
"""
# If it is not a dict-like object, return an empty set
if not isinstance(d, Mapping):
return set()
keys = d.keys()
for v in d.values():
# Update the keys set with the keys in each value by using the union (or) operator: |
keys |= nested_keys(v)
return keys
答案 3 :(得分:1)
如果要检查所有嵌套键,则可以创建一个循环函数,该函数检查查找的数据的类型,并在它是另一个字典(例如,
)时对其进行迭代def print_nested_keys(d):
for k in d.keys():
print(k)
if type(d[k]) == dict:
print('nested dict detected - recursing...')
print_nested_keys(d[k])
在这里,每当词典中的键之一指向另一本词典时,您都将递归调用此函数以读取较低级的词典键。当然,如果需要这样的列表,您总是可以附加在列表中找到的键,最后由您的函数返回。
答案 4 :(得分:0)
对于键,使用简单的recorsive函数:
def recursive_items(dict_name):
for key, value in a.items():
if type(value) is dict:
yield (key)
yield from recursive_items(value)
# print the keys
for key in recursive_items(a):
print(key)
这个函数对任何嵌套字典都有好处