我对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())然后获取另一个列表。但是我需要得到字典,因为我必须把它们弄清楚。
我该怎么做?
答案 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