用python排序二级defaultdict并返回defaultdict或dict

0 投票
3 回答
2068 浏览
提问于 2025-04-16 09:20

我有一个关于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

这段代码会按照你想要的方式打印出键和值,并且是排序好的。

撰写回答