@ 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