你可以使用新的将其加入到标准库的子模块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__()方法,该方法将允许对类的实例进行正确的酸洗和酸洗。这个问题不是必需的,但是是类似的问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)