我有一个嵌套的OrderedDict
我想转换成dict
。在其上应用dict()
显然只转换最后一个条目的最外层。
from collections import OrderedDict
od = OrderedDict(
[
(u'name', u'Alice'),
(u'ID', OrderedDict(
[
(u'type', u'card'),
(u'nr', u'123')
]
)),
(u'name', u'Bob'),
(u'ID', OrderedDict(
[
(u'type', u'passport'),
(u'nr', u'567')
]
))
]
)
print(dict(od))
输出:
{u'name': u'Bob', u'ID': OrderedDict([(u'type', u'passport'), (u'nr', u'567')])}
是否有直接方法转换所有发生的事件?
最简单的解决方案是使用json转储和加载
注意:以上代码适用于json称为可序列化对象的字典。可以找到默认对象类型列表here
因此,如果有序字典不包含特殊值,这就足够了。
编辑:根据评论,让我们改进上面的代码。假设
input_ordered_dict
可能包含默认情况下无法由json序列化的自定义类对象。 在这种情况下,我们应该将json.dumps
的default
参数与我们的自定义序列化程序一起使用。(例如):
这个例子可以进一步扩展到更大的范围。我们甚至可以添加过滤器或修改必要性的值。只需在
custom_serializer
函数中添加一个else部分对于自定义序列化程序,在顶部给出的函数应为:
这应该有效:
尽管,正如jornsharpe所提到的,可能没有理由这样做——一个
OrderedDict
(按设计)在一个dict
做的地方工作。注意:此答案仅部分正确,请检查https://stackoverflow.com/a/25057250/1860929以了解有关dict为何大小相同的更多信息。
原始答案
这并不能回答转换的问题,更多的是关于需要做什么的问题。
一个OrderedDict的大小是Dict的两倍的基本假设是有缺陷的。检查这个:
基本上两个都是同样大小的。
然而,操作所需的时间并不相同,事实上,创建一个大字典(具有100-10000个键)比创建具有相同键的OrderedDict快7-8倍左右。(在
ipython
中使用%timeit
验证)因此,在IMO中,您应该专注于将数据直接读入
dict
并对其进行操作,而不是先创建OrderedDict
,然后重复地将其转换为dict。相关问题 更多 >
编程相关推荐