【问题标题】:Can we use for loop to iterate over a dict of dicts?我们可以使用 for 循环来遍历一个字典吗?
【发布时间】:2017-06-30 06:43:11
【问题描述】:

我有一个嵌套字典和键值的字典。

 dicta = {'key1': {'keya': 'a', 'keyb': 'b'},
      'key2': {'key3':{'keyc': 'c'}}, 'key4': 4}}

有没有一种方法可以使用 for 循环到达“c”?

我试过了,

print(dicta['key2'])

for x in dicta['key2']:
    for y in x['key3']:
        print(y)

对于第一次打印,我得到了

{'key3': {'keyc': 'c'}}

但我得到 TypeError: string indices must be integers for the second print.

提前致谢! *我编辑了用dicta替换n;我第一次复制粘贴错了。

【问题讨论】:

  • 看起来您不应该在这里迭代。你可能只想要dicta['key2']['key3']

标签: python python-3.x dictionary


【解决方案1】:

一般来说,不会。字典可以任意递归深度,除了使用for 循环之外没有什么好的方法可以遍历它们。 (您可以使用列表实现自己的堆栈并模拟递归,但这不是“好”。)

this question.中有一些用于遍历字典(计算深度)的递归代码

具体来说,当然。提前知道结构,就可以使用正确数量的for循环:

n = {'key1': {'keya': 'a', 'keyb': 'b'},
     'key2': {'key3':{'keyc': 'c'}}, 'key4': 4}

for k1,v1 in n.items():
    try:
        for k2,v2 in v1.items():
            try:
                for k3,v3 in v2.items():
                    print(v3)
            except AttributeError:
                pass
    except AttributeError:
        pass

【讨论】:

  • 不使用 for 循环的标准遍历方式是什么?
  • 一个栈(深度优先搜索)、一个队列(广度优先搜索),或者用递归模拟其中任何一个。
【解决方案2】:

for i in somedict 是循环字典中的所有键。 更多详情来自dict views

遍历字典时,键和对应的值可以 使用items() 方法同时检索。

items() 返回字典项((键,值)对)的新视图。 所以你可以试试这个:

for k,v in dicta['key2'].items():
    if isinstance(v,dict):
        for k1,v1 in v.items():
            print(v1)

如果object参数是dict参数的一个实例,isinstance(v,dict)返回true,所以你不需要捕获异常。

看看looping-techniques

希望这会有所帮助。

【讨论】:

    【解决方案3】:
    for k in n:
        v = n.get(k)
        if isinstance(v, dict):
        for j in v:
            print(v.get(j))
    

    【讨论】:

      【解决方案4】:

      您可以使用递归深入到给定的字典并打印键及其值。

      def drill(dicta):
        for k in dicta.keys():
          if isinstance(dicta[k],dict):
            drill(dicta[k])
          else:
            print ('dicta[',k,']=',dicta[k])
        return
      

      【讨论】:

        【解决方案5】:

        使用嵌套循环可以获得所需的结果。

        for k,v in dicta.items():
             if k=="key2":
                 new_dict=v
                 for k1, v1 in new_dict.items():
                       print v1["keyc"]
        

        【讨论】:

        • 欢迎来到 Stack Overflow!虽然您可能已经解决了这个用户的问题,但纯代码的答案对于将来遇到这个问题的用户来说并不是很有帮助。请编辑您的答案以解释为什么您的代码解决了原始问题。
        猜你喜欢
        • 2013-02-20
        • 2011-03-18
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2021-06-04
        相关资源
        最近更新 更多