2016-07-22 5 views
0

У меня есть вложенный словарь (категория и подкатегории), dict, что у меня проблема с сортировкой.Заказ вложенного словаря в python

Выход dict является:

{u'sports': {u'basketball': {'name': u'Basketball', 'slug': u'basketball'}, u'baseball': {'name': u'Baseball', 'slug': u'baseball'}}, u'dance': {u'salsa': {'name': u'Salsa', 'slug': u'salsa'}}, u'arts': {u'other-5': {'name': u'Other', 'slug': u'other-5'}, u'painting': {'name': u'Painting', 'slug': u'painting'}}, u'music': {u'cello': {'name': u'Cello', 'slug': u'cello'}, u'accordion': {'name': u'Accordion', 'slug': u'accordion'}}} 

Как я могу отсортировать этот словарь, так что «другая» подкатегория всегда появляется в конце гнездового словаря. Например, заказ категории «искусство» должен быть следующим:

..., u'arts': {u'painting': {'name': u'Painting', 'slug': u'painting'}, u'other-5': {'name': u'Other', 'slug': u'other-5'}}... 
+2

Возможно, вам пригодится [OrderedDict] (https://docs.python.org/2/library/collections.html#ordereddict-objects) – Greg

+0

Есть ли какая-то конкретная причина, по которой вы хотите упорядочить категории? Python 'dict's по своей сути неупорядочен, но есть' OrderedDict', который запоминает порядок добавления ключей. –

ответ

0

Словарь Python (обычный dict экземпляров) не сортируются. Если вы хотите отсортировать Dict, вы можете:

from collections import OrderedDict 

mynewdict = OrderedDict(sorted(yourdict.items())) 

OrderedDict не обеспечивают механизм сортировки, но только соблюдать порядок ключей вставляются на него (мы сортируем эти ключи призвания отсортированы заранее).

Поскольку вам нужна конкретные критерии (позволяет сказать, что ваши ключи в алфавитном порядке для «другого» ключа, который идет к концу, за исключением), вы должны объявить его:

def mycustomsort(key): 
    return (0 if key != 'other' else 1, key) 
mynewdict = OrderedDict(sorted(yourdict.items(), key=mycustomsort)) 

Таким образом, вы создаете кортеж для вложенных критериев: первый критерий - другой против другого, и поэтому 0 или 1 (поскольку 1 больше, другое - позже), а второй критерий - это сам ключ. Вы можете удалить второй критерий и не возвращать кортеж, если хотите, но только 0 и 1, а код будет работать без алфавитной сортировки.

Это решение не будет работать, если вы планируете позже редактировать словарь, и нет стандартного класса, поддерживающего это.

+0

Спасибо за предоставление полного решения! Это отлично работало для моего использования. –

+0

На самом деле это не движется дальше, а просто сортируется в алфавитном порядке. –

+0

Функция исправлена: def mycustomsort (ключ): return (0, если «другое» не в ключевом ключе 1, клавиша) –

3

У вас есть некоторое принципиальное недоразумение в отношении словаря. Словарь в python похож на hash table, хеш-таблица не имеет порядка. Выход dict зависит от окружающей среды, поэтому вы не можете зависеть от этого. Вы можете увидеть один из способов вывода, в то время как другие люди видят другой путь. Вместо этого вы должны использовать OrderedDict.

+0

Значит, вы говорите, что этого не сделать? –

+1

Если вы хотите заказать, вы не должны даже использовать 'dict'. Вы можете избавиться от него с помощью 'OrderedDict', но мне кажется, что использование кортежей кортежей будет иметь больше смысла. –

+0

Благодарим вас за понимание. Почему вы рекомендуете кортежи над OrderedDict? –

Смежные вопросы