如何在 OrderedDict 中迭代 OrderedDict



嗨,我想解析一些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'])]))]))])

最新更新