2011-01-03 2 views
0

У меня есть вопрос о своем роде defaultdict в питонепитона сортировать defaultdict и два уровня возврата defaultdict или Dict

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

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()), а затем получить еще один список. Однако мне нужно получить диктофон, потому что я должен их повторить.

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

+2

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

+2

«Мне нужно получить диктофон, потому что я должен их повторить» не имеет никакого смысла. –

+0

Спасибо, я думаю, что неправильно понял словарь в python. –

ответ

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 

Это печатает ключи и значения, отсортированные по вашему желанию.

+0

Это действительно помогает! Благодаря! –

+1

Добро пожаловать. Теперь отметим ответ как принято :)) – 9000

1

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

If Правда использование OrderedDictelseвам не нужны словари;) использовать списки вместо:

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

@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 
Смежные вопросы