迭代Python中任意分层字典的项目

时间:2015-11-15 19:59:57

标签: python dictionary iterator

我在Python中有一个字典,在迭代中层数越来越多

我想迭代最后一层中存在的值。

假设这个词:

d = {'a':{'a':2},'b':{'c':2},'x':{'a':2}}
#the intuitive solution is
for key1,val in d.items():
    for key2,val2 in val.items():
        #integer value in val2, HOORAY

现在,如果我们添加一个循环,那么:

d = {'a':{'a':{'y':2}},'b':{'c':{'a':5}},'x':{'a':{'m':6}}}
#the intuitive solution is
for key1,val in d.items():
    for key2,val2 in val.items():
        for key3,val3 in val2.items():
             #integer value in val3

我寻找任意维度迭代的动态解决方案

如果有帮助,请考虑迭代中所有元素的已知和固定层数。

此外,我想知道如何在字典中映射整数。

2 个答案:

答案 0 :(得分:4)

使用递归最好解决这个问题:

def iter_leafs(d):
    for key, val in d.items():
        if isinstance(val, dict):
            yield from iter_leafs(val)
        else:
            yield val

使用示例:

>>> d = {'a':{'a':{'y':2}},'b':{'c':{'a':5}},'x':{'a':{'m':6}}}
>>> list(iter_leafs(d))
[6, 5, 2]

如果您还想跟踪密钥:

def iter_leafs(d, keys=[]):
    for key, val in d.items():
        if isinstance(val, dict):
            yield from iter_leafs(val, keys + [key])
        else:
            yield keys + [key], val

>>> list(iter_leafs(d))
[(['x', 'a', 'm'], 6), (['b', 'c', 'a'], 5), (['a', 'a', 'y'], 2)]

答案 1 :(得分:1)

我可能会离开这里,因为我不确定我是否完全理解你想要的东西,但这将获得最后一层的所有值:

{{1}}