如何重写此函数以实现OrderedDict?

如何重写此函数以实现OrderedDict?,第1张

如何重写此函数以实现OrderedDict?

你可以使用新的将其加入到标准库的子模块2.7版本 ✶* 。实际上,您需要的是一个不存在的+组合-
但可以通过如下所示的子类创建一个+组合:

OrderedDict
dict``collections



*
Ordered``defaultdict``OrderedDict

如果您的Python版本没有该版本,则

OrderedDict
应该可以使用Raymond
Hettinger的Py2.4
ActiveState配方的有序字典作为基类。

import collectionsclass 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 callable(default_factory)): 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, iter(self.items())    def __repr__(self):  # Optional.        return '%s(%r, %r)' % (self.__class__.__name__, self.default_factory, self.items())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文件产生的输出如下所示:

{'root':    OrderedDict(        [('a', ['1']),         ('aa', [OrderedDict([('b', [OrderedDict([('c', ['2'])]), '2'])])]),         ('aaa', ['3']),         ('aaaa', [OrderedDict([('bb', ['4'])])]),         ('aaaaa', ['5'])        ]    )}aaaaaaaaaaaaaaa

我认为这接近您想要的。

小更新:

添加了一种

__reduce__()
方法,该方法将允许对类的实例进行正确的酸洗和酸洗。这个问题不是必需的,但是是类似的问题。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5640222.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存