Python сортирует двухуровневый defaultdict и возвращает defaultdict или dict - PullRequest
0 голосов
/ 03 января 2011

У меня есть вопрос о сортировке defaultdict в python

Предположим, у меня есть следующие коды:

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

Я пытался использовать сортировку (a.iteritems ()), а затем получить другой список. Тем не менее, мне нужно быть диктатором, потому что я должен его преследовать.

Как я могу это сделать?

Ответы [ 3 ]

3 голосов
/ 03 января 2011
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 голос
/ 03 января 2011

Похоже, вы просто не используете словари. Вам нужен доступ к значениям по ключу?

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]]
0 голосов
/ 03 января 2011

@ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...