Сортировка словаря по длине ключа

Кто-нибудь знает, как отсортировать этот словарь по длине ключа?

{
    'http://ccc.com/viewvc/' : [{'type': 'web-servers', 'app': 'Apache', 'ver': '2.2.14'}, {'type': 'operating-systems', 'app': 'Ubuntu', 'ver': None}],    
    'http://bbb.com/' : [{'type': 'web-servers', 'app': 'Apache', 'ver': '2.2.22'}, {'type': 'programming-languages', 'app': 'PHP', 'ver': '5.3.10'}, {'type': 'cms', 'app': 'Drupal', 'ver': None}, {'type': 'operating-systems', 'app': 'Ubuntu', 'ver': None}, {'type': 'javascript-frameworks', 'app': 'jQuery', 'ver': None}, {'type': 'captchas', 'app': 'Mollom', 'ver': None}]
}

Ожидаемый результат:

{
    'http://bbb.com/' : [{'type': 'web-servers', 'app': 'Apache', 'ver': '2.2.22'}, {'type': 'programming-languages', 'app': 'PHP', 'ver': '5.3.10'}, {'type': 'cms', 'app': 'Drupal', 'ver': None}, {'type': 'operating-systems', 'app': 'Ubuntu', 'ver': None}, {'type': 'javascript-frameworks', 'app': 'jQuery', 'ver': None}, {'type': 'captchas', 'app': 'Mollom', 'ver': None}]
    'http://ccc.com/viewvc/' : [{'type': 'web-servers', 'app': 'Apache', 'ver': '2.2.14'}, {'type': 'operating-systems', 'app': 'Ubuntu', 'ver': None}],    

}

Я использую Python 2.6.


person badc0re    schedule 01.08.2012    source источник
comment
Словари неупорядочены; вы хотели просто отобразить словарь? Перебирать ключи в отсортированном порядке? Уточните, пожалуйста, ожидаемый результат.   -  person Martijn Pieters    schedule 01.08.2012
comment
я хочу отсортировать словарь по длине ключа... не для отображения, для дальнейшего использования в приложении   -  person badc0re    schedule 01.08.2012
comment
Словари не могут быть отсортированы.   -  person Noufal Ibrahim    schedule 01.08.2012


Ответы (2)


newlist = yourdict.items()
sortedlist = sorted(newlist, key=lambda s: len(s[0]))

Вы получите новый список кортежей, отсортированных по длине исходных ключей.

person Aesthete    schedule 01.08.2012
comment
Нет, не будет... list.sort является встроенной функцией и возвращает None. Измените его на sorted(newlist, key=lambda s: len(s[0])) - person jamylak; 01.08.2012
comment
Все кортежи в newlist имеют длину 2. Вам нужно key=lambda s: len(s[0]) - person David Robinson; 01.08.2012
comment
Э-э, я знал, что у меня это было не просто так. Должно быть, пора домой! Спасибо @DavidRobinson - person Aesthete; 01.08.2012

Питон v2.7+

>>> from collections import OrderedDict
>>> d = {
    'http://ccc.com/viewvc/' : [{'type': 'web-servers', 'app': 'Apache', 'ver': '2.2.14'}, {'type': 'operating-systems', 'app': 'Ubuntu', 'ver': None}],    
    'http://bbb.com/' : [{'type': 'web-servers', 'app': 'Apache', 'ver': '2.2.22'}, {'type': 'programming-languages', 'app': 'PHP', 'ver': '5.3.10'}, {'type': 'cms', 'app': 'Drupal', 'ver': None}, {'type': 'operating-systems', 'app': 'Ubuntu', 'ver': None}, {'type': 'javascript-frameworks', 'app': 'jQuery', 'ver': None}, {'type': 'captchas', 'app': 'Mollom', 'ver': None}]
}
>>> OrderedDict(sorted(d.iteritems(), key=lambda x: len(x[0])))
OrderedDict([('http://bbb.com/', [{'ver': '2.2.22', 'app': 'Apache', 'type': 'web-servers'}, {'ver': '5.3.10', 'app': 'PHP', 'type': 'programming-languages'}, {'ver': None, 'app': 'Drupal', 'type': 'cms'}, {'ver': None, 'app': 'Ubuntu', 'type': 'operating-systems'}, {'ver': None, 'app': 'jQuery', 'type': 'javascript-frameworks'}, {'ver': None, 'app': 'Mollom', 'type': 'captchas'}]), ('http://ccc.com/viewvc/', [{'ver': '2.2.14', 'app': 'Apache', 'type': 'web-servers'}, {'ver': None, 'app': 'Ubuntu', 'type': 'operating-systems'}])])

Более ранние версии Python

См. OrderedDict для более старых версий python.

person jamylak    schedule 01.08.2012
comment
я использую более старую версию python => 2.6 - person badc0re; 01.08.2012
comment
@badc0re Вы можете выполнить поиск по запросу «Рецепт OrderedDict для Python 2.6». - person jamylak; 01.08.2012