python获取子指数中的所有键

时间:2014-03-14 13:30:36

标签: python dictionary

在python中,如果我有一个包含子词典的词典

d = {
    'a' : {
        'aa': {},
        'ab': {},
    },
    'b' : {
        'ba': {},
        'bb': {},
    }
}

如何获取每个子词典的键?

d.keys()
d['a'].keys()
d['b'].keys()

这是正常的方法,但如果我有很多子目录,我怎么能得到每个子字典的键?

修改

我需要在五个或更多级别的字典中访问密钥

d[k1][k2][k3][k4][k5]

在某些情况下,我需要“在”k2键下面的信息,在其他情况下“在”k3键下面等等。

3 个答案:

答案 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,以便更明显地显示其含义。