嗨,我想解析一些order_dicts。我有以下错误
ipdb> for elem in my_orderdict['codeBook'].keys():
print("{0} ===> {1}".format(elem, my_orderdict[elem ]))
*** KeyError: '@xmlns'
因此,假设我创建了一个 Orderdict,我想稍后迭代该命令以获取每个项目和值。
ipdb >>> from collections import *
ipdb >>> my_orderdict =
OrderedDict([('codeBook',
OrderedDict([('@xmlns', 'http://www.johndoe.com'),
('@xmlns:xsi',
'http://www.w3.org/2001/XMLSchema-instance'),
('@version', '1.2.2'),
('@ID', '_71M0001XCB-F-1991-novembre'),
('@xml-lang', 'en'),
('@xsi:schemaLocation', 'http://www.johndoe.xsd'),
('stdyDscr',
OrderedDict([('stdyInfo',
OrderedDict([('subject',
OrderedDict([('keyword',
['Chômage',
'Emploi'])]))]))]))]))])
ipdb >>> type(my_orderdict)
<class 'collections.OrderedDict'>
ipdb >>> my_orderdict['codeBook'].keys()
odict_keys(['@xmlns', '@xmlns:xsi', '@version',
'@ID', '@xml-lang', '@xsi:schemaLocation', 'stdyDscr'])
我正在创建一个循环来访问每个odict_keys的值
for elem in my_orderdict['codeBook'].keys():
print("{0} ===> {1}".format(elem, my_orderdict[elem ]))
我想要的结果应该是
@xmlns ===> 'http://www.johndoe.com'
@xmlns:xsi ===> 'http://www.w3.org/2001/XMLSchema-instance'
@version ===> 1.2.2
...
这样我就可以解析这个命令。现在我的错误是:
ipdb> for elem in my_orderdict['codeBook'].keys():
print("{0} ===> {1}".format(elem, my_orderdict[elem ]))
*** KeyError: '@xmlns'
所以我无法访问我的第一个命令的属性。
看起来您的循环没有访问正确的字典。您应该使用:
for elem in my_orderdict['codeBook'].keys():
print("{0} ===> {1}".format(elem, my_orderdict['codeBook'][elem ]))
请注意内部循环中的my_orderdict['codeBook']
。
基本上:您正在迭代字典my_orderdict['codeBook']
的元素,但尝试直接访问my_orderdict
的值。
希望这有帮助!
您正在迭代子字典的键:for elem in my_orderdict['codeBook'].keys():
但是然后在父字典上使用这些键:my_orderdict[elem ]
您需要使用my_orderdict['codeBook']
,所以:
In [2]: data = OrderedDict([('codeBook',
...: OrderedDict([('@xmlns', 'http://www.johndoe.com'),
...: ('@xmlns:xsi',
...: 'http://www.w3.org/2001/XMLSchema-instance'),
...: ('@version', '1.2.2'),
...: ('@ID', '_71M0001XCB-F-1991-novembre'),
...: ('@xml-lang', 'en'),
...: ('@xsi:schemaLocation', 'http://www.johndoe.xsd'),
...: ('stdyDscr',
...: OrderedDict([('stdyInfo',
...: OrderedDict([('subject',
...: OrderedDict([('keyword',
...: ['Chômage',
...: 'Emploi'])]))]))]))]))])
In [3]: for elem in data['codeBook']: #note, call to .keys is not necessary
...: print("{0} ===> {1}".format(elem, data['codeBook'][elem]))
...:
@xmlns ===> http://www.johndoe.com
@xmlns:xsi ===> http://www.w3.org/2001/XMLSchema-instance
@version ===> 1.2.2
@ID ===> _71M0001XCB-F-1991-novembre
@xml-lang ===> en
@xsi:schemaLocation ===> http://www.johndoe.xsd
stdyDscr ===> OrderedDict([('stdyInfo', OrderedDict([('subject', OrderedDict([('keyword', ['Chômage', 'Emploi'])]))]))])
但是,在这种情况下,您可以只使用items
,它迭代键值对:
In [4]: for k, v in data['codeBook'].items():
...: print("{0} ===> {1}".format(k, v))
...:
@xmlns ===> http://www.johndoe.com
@xmlns:xsi ===> http://www.w3.org/2001/XMLSchema-instance
@version ===> 1.2.2
@ID ===> _71M0001XCB-F-1991-novembre
@xml-lang ===> en
@xsi:schemaLocation ===> http://www.johndoe.xsd
stdyDscr ===> OrderedDict([('stdyInfo', OrderedDict([('subject', OrderedDict([('keyword', ['Chômage', 'Emploi'])]))]))])