【问题标题】:Iterate through items of an arbitrary layered dictionary in Python在 Python 中遍历任意分层字典的项目
【发布时间】:2016-02-16 21:35:52
【问题描述】:

我有一本 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

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

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

另外我想知道一个整数是如何在字典中映射的。

【问题讨论】:

  • sorted 与嵌套迭代无关。它只是对一系列元素进行排序。
  • @Bakuriu 我编辑了描述。

标签: python dictionary iterator


【解决方案1】:

这最好使用递归来解决:

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)]

【讨论】:

  • 甜蜜的收获! Python很棒..我期待黑魔法内置功能。谢谢!
【解决方案2】:

我可能在这里偏离基础,因为我不确定我是否完全理解你想要的,但这将获得最后一层中的所有值:

def get_values(my_dict):
    sub_vals = []
    actual_vals = []
    for val in my_dict.values():
        try:
            sub_vals += get_values(val)
        except AttributeError:
            actual_vals += [val]
    return sub_vals + actual_vals

【讨论】:

  • 如果我在 d 中有 50 个嵌套字典,那么迭代将需要为嵌套循环编写 50 个。
  • 我不关注。您不必编写任何嵌套的 for 循环。尝试使用您的第二个 d 字典。你会看到get_values(d) 产生[2, 6, 5]
  • 很糟糕,我没有看到您使用递归。您的解决方案也很有效,这就是我最初对 try except 的想法。但是如果你看最后一次编辑,我还需要字典的键。
猜你喜欢
  • 2014-10-28
  • 2011-02-24
  • 2022-10-02
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多