简体   繁体   English

循环浏览从yaml加载的嵌套python字典/列表

[英]Loop through a nested python dictionary/list loaded from yaml

Ok, this is probably stupid. 好吧,这可能很愚蠢。 Basically i'm trying to loop through my nested yaml-file and do stuff with for example every key-a value in my list. 基本上,我试图遍历嵌套的yaml文件并使用例如列表中的每个key-a值进行处理。 I have read alot and i'm able to loop through a nested dictionary without the list but I don't wan't to use unique key's for the nodes. 我已经读了很多书,并且可以遍历没有列表的嵌套字典,但是我不想为节点使用唯一键。

This works: 这有效:

lev-0a: lev-1a: node1: key-a: '1' lev-0a:lev-1a:node1:密钥-a:'1'

node2:
 key-a: '2'

But when i'm trying to iterate a nested dict with "list" objects it fails. 但是,当我尝试使用“列表”对象迭代嵌套字典时,它会失败。

Yaml: 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'

Print settings from python: 从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'}]}}]}}

My code: 我的代码:

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

Error: 错误:

TypeError: list indices must be integers, not str

If I do this: 如果我这样做:

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

I will get: 我会得到:

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

Thanks! 谢谢!

This alone should have raised an error: settings['lev-0a']['lev-1a'].iteritems(): . 仅此一项就应该引发一个错误: settings['lev-0a']['lev-1a'].iteritems(): In your code, the value pointed to by ['lev-1a'] appears to be a list , not a dict , so calling iteritems() on it is very suspect. 在您的代码中, ['lev-1a']指向的值似乎是一个list ,而不是一个dict ,因此在其上调用iteritems()非常值得怀疑。

What you seem to have been looking for is something like: 您似乎一直在寻找的东西是:

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

That prints both [ key-a ] values found inside of the two dicts from the ['lev-1a'] list. 打印从['lev-1a']列表的两个字典中找到的两个[ key-a ]值。 Does this answer your question at all? 这完全可以回答您的问题吗? I have to admit I am not certain I fully understand your question. 我不得不承认我不确定我是否完全理解你的问题。 Feel free to elaborate and I'll edit accordingly. 随时进行详细说明,我将进行相应的编辑。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM