用python排序二级defaultdict并返回defaultdict或dict
我有一个关于Python中排序defaultdict的问题。
假设我有以下代码:
a = defaultdict(defaultdict)
a['c']['C'] = 1
a['b']['B'] = 2
a['a']['A'] = 3
a['a']['AA'] = 4
我想先按第一个键进行排序,然后得到另一个排序后的defaultdict,像这样:
a['a']['A'] = 3
a['a']['AA'] = 4
a['b']['B'] = 2
a['c']['C'] = 1
我试过用sorted(a.iteritems())来获取一个列表。但是我需要的是字典,因为我还需要对它进行遍历。
我该怎么做呢?
3 个回答
0
@Ismail说得对 - 除非你是在插入之前先查找数据,否则其实不需要用到defaultdict。我假设你正在做类似这样的事情:
from collections import defaultdict
a = defaultdict(lambda: defaultdict(int))
for x,y in (
('c','C'),
('a','AA'),
('a','A'),
('a','AA'),
('b','B'),
('a','AA')
# etc
):
a[x][y] += 1
这里有一个迭代器,可以完成你想要的功能:
def sortedRecursiveDictIter(d, key=None, prekey=None):
if isinstance(d,dict):
if prekey is None:
prekey = tuple()
keylist = d.keys()
keylist.sort(key=key)
for k in keylist:
for nk,ni in sortedRecursiveDictIter(d[k], key, prekey+tuple([k])):
yield nk,ni
else:
yield prekey,d
for k,i in sortedRecursiveDictIter(a):
print k,i
返回
('a', 'A') 3
('a', 'AA') 4
('b', 'B') 2
('c', 'C') 1
1
看起来你只是错误地使用了字典。你需要通过键来访问值吗?
如果是的话,使用 OrderedDict
;否则,你就不需要字典了,直接用列表就行了:
>>> a = [['c', 'C', 1],
... ['b', 'B', 2],
... ['a', 'A', 3],
... ['a', 'AA', 4]]
>>> sorted(a, key=lambda entry: entry[1])
[['a', 'A', 3], ['a', 'AA', 4], ['b', 'B', 2], ['c', 'C', 1]]
3
for k1 in sorted(a.keys()):
sub = a[k1]
for k2 in sorted(sub.keys()):
print k1, k2, sub[k2] # or do whatever else
这段代码会按照你想要的方式打印出键和值,并且是排序好的。