循环遍历从yaml加载的嵌套python字典/列表

时间:2015-02-16 08:33:30

标签: python dictionary nested yaml

好的,这可能是愚蠢的。基本上我正在尝试循环遍历我的嵌套yaml文件并使用例如每个键 - 我的列表中的值。我已经阅读了很多,我可以在没有列表的情况下循环嵌套字典,但我不想对节点使用唯一键。

这有效:

利-0A:   利-1A:     节点1:      key-a:'1'

node2:
 key-a: '2'

但是当我试图用“list”对象迭代一个嵌套的dict时,它失败了。

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'}]}

谢谢!

1 个答案:

答案 0 :(得分:3)

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

您似乎一直在寻找的是:

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

打印key-a列表中两个dicts中找到的[{['lev-1a']]值。这会回答你的问题吗?我不得不承认我不确定我完全理解你的问题。随意详细说明,我会相应编辑。