[英]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.