遍历从 yaml 加载的嵌套 python dictionary/list

Loop through a nested python dictionary/list loaded from yaml

好吧,这可能是愚蠢的。基本上,我试图遍历我的嵌套 yaml 文件,并使用列表中的每个键值来做一些事情。我读了很多书,我可以在没有列表的情况下循环遍历嵌套字典,但我不想对节点使用唯一键。

这个有效:

lev-0a: lev-1a: 节点 1: 键-a:'1'

node2:
 key-a: '2'

但是当我尝试用 "list" 对象迭代嵌套字典时失败了。

Yaml:

lev-0a:
  lev-1a:
    - key-a: '1'
      key-b: '2'
      key-c: '3'
      key-d:
        level-2:
          - key: 'a'
          - key: 'b'
          - key: 'c'

    - key-a: '7'
      key-b: '8'
      key-c: '9'
      key-d:
        level-2:
          - key: 'x'
          - key: 'y'
          - key: 'z'

来自 python 的打印设置:

{'lev-0a': {'lev-1a': [{'key-c': '3', 'key-b': '2', 'key-a': '1', 'key-d': {'level-2': [{'key': 'a'}, {'key': 'b'}, {'key': 'c'}]}}, {'key-c': '9', 'key-b': '8', 'key-a': '7', 'key-d': {'level-2': [{'key': 'x'}, {'key': 'y'}, {'key': 'z'}]}}]}}

我的代码:

env.settings_file = env.setting_path + '/settings.yaml'

def load_settings(settings=env.settings_file):
    try:
        with open(settings) as stream:
            data = yaml.load(stream)
            return data
    except IOError as error:
        print ('File error: ' + str(error))


def dev(settings=load_settings()):

    for k, v in settings['lev-0a']['lev-1a'].iteritems():
        print v['key-a']
        # do stuff with every key-a value

错误:

TypeError: list indices must be integers, not str

如果我这样做:

for k, v in settings['lev-0a']['lev-1a'][0].iteritems():
    print k,v

我会得到:

key-c 3
key-b 2
key-a 1
key-d {'level-2': [{'key': 'a'}, {'key': 'b'}, {'key': 'c'}]}

谢谢!

仅此一项 就应该引发错误:settings['lev-0a']['lev-1a'].iteritems():。在您的代码中,['lev-1a'] 指向的值似乎是 list,而不是 dict,因此对其调用 iteritems() 非常可疑。

您似乎一直在寻找的是:

for dict1a in settings['lev-0a']['lev-1a']:
    print dict1a['key-a']

这会打印在 ['lev-1a'] 列表中的两个字典中找到的两个 [key-a] 值。这是否完全回答了您的问题?我不得不承认我不确定我是否完全理解你的问题。请随意详细说明,我会相应地进行编辑。