Python 如何在OrderedICT中迭代OrderedICT

Python 如何在OrderedICT中迭代OrderedICT,python,python-3.x,ordereddictionary,Python,Python 3.x,Ordereddictionary,嗨,我想解析一些订单。我有以下错误 ipdb> for elem in my_orderdict['codeBook'].keys(): print("{0} ===> {1}".format(elem, my_orderdict[elem ])) *** KeyError: '@xmlns' 假设我创建了一个Orderdict,我想稍后迭代它来获取每个项和值 ipdb >>> from collections import * ipdb &

嗨,我想解析一些订单。我有以下错误

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'])
我想要的结果应该是

@xmlns ===> 'http://www.johndoe.com'
@xmlns:xsi ===> 'http://www.w3.org/2001/XMLSchema-instance'
@version ===> 1.2.2
...
这样我就可以解析这个orderdict了。现在我的错误是:

ipdb> for elem in my_orderdict['codeBook'].keys():
          print("{0}  ===> {1}".format(elem, my_orderdict[elem ]))
*** KeyError: '@xmlns'

因此,我无法访问第一个orderdict的属性。

看起来您的循环没有访问正确的字典。您应该使用:

for elem in my_orderdict['codeBook'].keys():
    print("{0}  ===> {1}".format(elem, my_orderdict['codeBook'][elem ]))
注意内部循环中的
my_orderdict['codeBook']

基本上:您正在迭代字典
my_orderdict['codeBook']
的元素,但试图直接访问
my_orderdict
的值


希望这有帮助

您正在迭代子目录的键:
用于my_orderdict['codeBook']中的元素。键():
但是在父目录上使用这些键:
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'])]))]))])
但是,在这种情况下,您可以只使用
,它在键值对上进行迭代:


谢谢你的回答!
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'])]))]))])
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'])]))]))])