在python中,如果我有一个包含子词典的词典
d = {
'a' : {
'aa': {},
'ab': {},
},
'b' : {
'ba': {},
'bb': {},
}
}
如何获取每个子词典的键?
d.keys()
d['a'].keys()
d['b'].keys()
这是正常的方法,但如果我有很多子目录,我怎么能得到每个子字典的键?
我需要在五个或更多级别的字典中访问密钥
d[k1][k2][k3][k4][k5]
在某些情况下,我需要“在”k2键下面的信息,在其他情况下“在”k3键下面等等。
答案 0 :(得分:5)
如果你需要所有等级的钥匙,你可以递归:
def nested_keys(d):
yield d.keys()
for value in d.values():
if isinstance(value, dict):
for res in nested_keys(value):
yield res
这是一个生成器函数,您可以循环输出或在其上调用list
。这会产生密钥的序列,而不是单个密钥。例如,在Python 3中,这意味着您将获得字典视图,并且包含空字典:
>>> d = {
... 'a' : {
... 'aa': {},
... 'ab': {},
... },
... 'b' : {
... 'ba': {},
... 'bb': {},
... }
... }
>>> def nested_keys(d):
... yield d.keys()
... for value in d.values():
... if isinstance(value, dict):
... for res in nested_keys(value):
... yield res
...
>>> for keys in nested_keys(d):
... print keys
...
['a', 'b']
['aa', 'ab']
[]
[]
['ba', 'bb']
[]
[]
这并非有用,实际上,因为你不知道密钥属于哪个词典。
答案 1 :(得分:2)
此解决方案适用于任意级嵌套词典
d = {
'a' : {
'aa': {},
'ab': {},
},
'b' : {
'ba': {},
'bb': {},
}
}
from itertools import chain
def rec(current_dict):
children = []
for k in current_dict:
yield k
if isinstance(current_dict[k], dict):
children.append(rec(current_dict[k]))
for k in chain.from_iterable(children):
yield k
print list(rec(d))
# ['a', 'b', 'aa', 'ab', 'ba', 'bb']
答案 2 :(得分:0)
这取决于您是否在子区域中有字典。您可以创建一个通过递归检查类型的函数
def checksubtype(d):
# d is a dictionary check the subtypes.
for k in d:
if type(d[k]) == type(d):
print 'key', k, 'contains a dictionary'
checktype(d[k])
else:
print 'key', k, 'has type', type(d[k])
>>> d = {'a': {'aa': [1, 2, 3], 'bb': [3, 4]}, 'b': {'ba': [5, 6], 'bb': [7, 8]}}
>>> checksubtype(d)
key a contains a dictionary
key aa has type <type 'list'>
key bb has type <type 'list'>
key b contains a dictionary
key ba has type <type 'list'>
key bb has type <type 'list'>
我使用了直接检查类型而非isinstance,以便更明显地显示其含义。