我有一些由OrderedDicts组成的trie(但顺序错误),如下所示:
test = {
'ab':{
'1':{},
'2':{
'002':{},
'001':{}}},
'aa':{
'02':{
'ac':{},
'01':{},
'ca':{},
'ab':{}},
'01':{
'b':{},
'z':{
'0':{},
'1':{}}}}
}
如何在所有后续关卡中对此词典进行完整排序?
如果我使用 collections.OrderedDict(sorted(test.iteritems())) ,我只对第一级进行排序。
我觉得我需要创建一个函数,它会以某种方式递归调用自己直到最深层次,但在我花了很多时间尝试不同的方法来解决问题后,我仍然被困在这里。
最终必须看起来像这样:
test = {
'aa':{
'01':{
'b':{},
'z':{
'0':{},
'1':{}}},
'02':{
'01':{},
'ab':{},
'ac':{},
'ca':{}}},
'ab':{
'1':{},
'2':{
'001':{},
'002':{}}}
}
答案 0 :(得分:3)
使用递归,请记住有两种情况:分支和叶子。一定要考虑到这两点。
def make_ordered(d):
if isinstance(d, dict):
return OrderedDict(sorted((key, make_ordered(value)) for key, value in d.iteritems()))
else:
return d
答案 1 :(得分:1)
如果你能承受额外的依赖,我会推荐blist package。它提供了许多已排序的容器,包括sorteddict
。然后你的字典就会一直保持排序。
检查sorteddict class docs的确切用法。软件包本身就是生产质量和BSD许可证,因此在任何专有代码中都不会出现问题。
答案 2 :(得分:1)
from collections import OrderedDict as OD
def order(X):
retval = OD()
# The standard iterator of a dict is its keys.
for k in sorted(X):
# Incase it something we can't handle.
if isinstance(X[k], dict):
# I want my children dicts in order.
retval[k] = order(X[k])
else:
retval[k] = X[k]
return retval