第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何重寫此函數(shù)以實現(xiàn)OrderedDict?

如何重寫此函數(shù)以實現(xiàn)OrderedDict?

桃花長相依 2019-11-19 15:22:14
我有以下功能,可以完成將XML文件解析為字典的工作。不幸的是,由于不對Python字典進行排序,因此我無法按需要在各個節(jié)點之間循環(huán)。如何更改此值,使其輸出有序字典,當與循環(huán)時,該字典反映節(jié)點的原始順序for。def simplexml_load_file(file):    import collections    from lxml import etree    tree = etree.parse(file)    root = tree.getroot()    def xml_to_item(el):        item = None        if el.text:            item = el.text        child_dicts = collections.defaultdict(list)        for child in el.getchildren():            child_dicts[child.tag].append(xml_to_item(child))        return dict(child_dicts) or item    def xml_to_dict(el):        return {el.tag: xml_to_item(el)}    return xml_to_dict(root)x = simplexml_load_file('routines/test.xml')print xfor y in x['root']:    print y輸出:{'root': {    'a': ['1'],    'aa': [{'b': [{'c': ['2']}, '2']}],    'aaaa': [{'bb': ['4']}],    'aaa': ['3'],    'aaaaa': ['5']}}aaaaaaaaaaaaaaa我如何實現(xiàn)collections.OrderedDict以便可以確定節(jié)點的正確順序?XML文件供參考:<root>    <a>1</a>    <aa>        <b>            <c>2</c>        </b>        <b>2</b>    </aa>    <aaa>3</aaa>    <aaaa>        <bb>4</bb>    </aaaa>    <aaaaa>5</aaaaa></root>
查看完整描述

3 回答

?
料青山看我應如是

TA貢獻1772條經(jīng)驗 獲得超8個贊

你可以使用新的將其加入到標準庫的子模塊2.7版本?。實際上,您需要的是一個不存在的+ 組合-但可以通過如下所示的子類創(chuàng)建一個+ 組合:OrderedDictdictcollectionsOrdereddefaultdictOrderedDict


?如果您的Python版本沒有該版本,則OrderedDict應該可以使用Raymond Hettinger的Py2.4 ActiveState食譜的有序詞典作為基類。


import collections


class OrderedDefaultdict(collections.OrderedDict):

    """ A defaultdict with OrderedDict as its base class. """


    def __init__(self, default_factory=None, *args, **kwargs):

        if not (default_factory is None

                or isinstance(default_factory, collections.Callable)):

            raise TypeError('first argument must be callable or None')

        super(OrderedDefaultdict, self).__init__(*args, **kwargs)

        self.default_factory = default_factory  # called by __missing__()


    def __missing__(self, key):

        if self.default_factory is None:

            raise KeyError(key,)

        self[key] = value = self.default_factory()

        return value


    def __reduce__(self):  # optional, for pickle support

        args = (self.default_factory,) if self.default_factory else tuple()

        return self.__class__, args, None, None, self.iteritems()


    def __repr__(self):  # optional

        return '%s(%r, %r)' % (self.__class__.__name__, self.default_factory,

                               list(self.iteritems()))


def simplexml_load_file(file):

    from lxml import etree


    tree = etree.parse(file)

    root = tree.getroot()


    def xml_to_item(el):

        item = el.text or None

        child_dicts = OrderedDefaultdict(list)

        for child in el.getchildren():

            child_dicts[child.tag].append(xml_to_item(child))

        return collections.OrderedDict(child_dicts) or item


    def xml_to_dict(el):

        return {el.tag: xml_to_item(el)}


    return xml_to_dict(root)


x = simplexml_load_file('routines/test.xml')

print(x)


for y in x['root']:

    print(y)

測試XML文件產(chǎn)生的輸出如下所示:


{'root':

    OrderedDict(

        [('a', ['1']),

         ('aa', [OrderedDict([('b', [OrderedDict([('c', ['2'])]), '2'])])]),

         ('aaa', ['3']),

         ('aaaa', [OrderedDict([('bb', ['4'])])]),

         ('aaaaa', ['5'])

        ]

    )

}


a

aa

aaa

aaaa

aaaaa

我認為這接近您想要的。


小更新:


添加了一種__reduce__()方法,該方法將允許對類的實例進行正確的酸洗和酸洗。這個問題不是必需的,但是是類似的問題。


查看完整回答
反對 回復 2019-11-19
?
眼眸繁星

TA貢獻1873條經(jīng)驗 獲得超9個贊

martineau的食譜對我有用,但是從DefaultDict繼承的copy()方法有問題。以下方法可解決此缺陷:


class OrderedDefaultDict(OrderedDict):

    #Implementation as suggested by martineau


    def copy(self):

         return type(self)(self.default_factory, self)

請考慮,此實現(xiàn)沒有深度復制,這對于默認詞典來說尤其如此,在大多數(shù)情況下是正確的選擇


查看完整回答
反對 回復 2019-11-19
  • 3 回答
  • 0 關注
  • 550 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號