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

你可以使用新的将其加入到标准库的子模块2.7版本✶。实际上,您需要的是一个不存在的+ 组合-但可以通过如下所示的子类创建一个+ 组合: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文件产生的输出如下所示:

{'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__()方法,该方法将允许对类的实例进行正确的酸洗和酸洗。这个问题不是必需的,但是是类似的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值