遍历从 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
] 值。这是否完全回答了您的问题?我不得不承认我不确定我是否完全理解你的问题。请随意详细说明,我会相应地进行编辑。
好吧,这可能是愚蠢的。基本上,我试图遍历我的嵌套 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
] 值。这是否完全回答了您的问题?我不得不承认我不确定我是否完全理解你的问题。请随意详细说明,我会相应地进行编辑。