python排序两级defaultdict并返回defaultdict或dict

时间:2011-01-03 13:11:58

标签: python dictionary

我对python

中的sort 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 :(得分: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

这将打印按您希望排序的键和值。

答案 1 :(得分:1)

看起来你只是错过了使用词典。您是否需要按键访问值?

If正确使用OrderedDict else 您不需要词典;)请改用列表:

>>> 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]]

答案 2 :(得分: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