好的,这可能是愚蠢的。基本上我正在尝试循环遍历我的嵌套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'}]}
谢谢!
答案 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']
]值。这会回答你的问题吗?我不得不承认我不确定我完全理解你的问题。随意详细说明,我会相应编辑。