2017-02-22 51 views
1

Я пишу сценарий в Python - и у меня есть словарь словарей, который выглядит примерно так:Сортировка словаря Словари - Python

"abc": { 
    "name": "Joey", 
    "order: 3 
    }, 
"def": { 
    "name": "Allen", 
    "order": 2 
    }, 
"ghi": { 
    "name": "Tim", 
    "order": 1 
    } 

Теперь я хотел бы отсортировать этот словарь по к значению «порядок».

Значение, отсортированный словарь будет выглядеть следующим образом:

"ghi": { 
    "name": "Tim", 
    "order": 1 
    } 
"def": { 
    "name": "Allen", 
    "order": 2 
    }, 
"abc": { 
    "name": "Joey", 
    "order: 3 
    } 

Может кто-нибудь помочь мне с этим? Я нашел способы отсортировать список словарей, но не словарь со словарем ...

Любая помощь была бы очень полезной, спасибо!

+2

Вы не можете отсортировать словарь без использования 'OrderedDict' или преобразований в список. –

+3

«dict» всегда несортирован. – ZdaR

+0

Ответы в [Python: сортировка словаря списков] (http://stackoverflow.com/questions/1217251/python-sorting-a-dictionary-of-lists?rq=1) можно легко адаптировать к dict of dicts , – glibdud

ответ

2

Использование sorted для сортировки «порядка» и collections.OrderedDict для хранения результата,

import collections 

d = { 
    "abc": { 
     "name": "Joey", 
     "order": 3 
     }, 
    "def": { 
     "name": "Allen", 
     "order": 2 
     }, 
    "ghi": { 
     "name": "Tim", 
     "order": 1 
     } 
    } 

result = collections.OrderedDict(sorted(d.items(), key=lambda t:t[1]["order"])) 

# Output 
print(result) 
OrderedDict([('ghi', {'name': 'Tim', 'order': 1}), 
      ('def', {'name': 'Allen', 'order': 2}), 
      ('abc', {'name': 'Joey', 'order': 3})]) 
+0

Это также может печатать '' ghi ', {' order ': 1,' name ':' Tim '} ', хотя это может быть и не быть релевантным. –

+0

@sphericalcowboy, да, это было так, как 'dict' является несортированным. – SparkAndShine

0

Словарь не похож на список - у него нет особого «заказа». Это просто набор ключей и их соответствующих значений, поэтому словари не могут быть отсортированы.

Если вы хотите узнать больше об этом, то docs дает хороший обзор типа данных.

1

Не уверен, что именно это вы пытаетесь достичь. Если вы хотите сделать что-то по следующим направлениям, то без использования OrderedDict:

dct_of_dcts = { 
    "abc": 
     { 
      "name": "Joey", 
      "order": 3 
     }, 
    "def": 
     { 
      "name": "Allen", 
      "order": 2 
     }, 
    "ghi": 
     { 
      "name": "Tim", 
      "order": 1 
     }} 

for k, v in sorted(dct_of_dcts.items(), key=lambda e: e[1]["order"]): 
    print(k, v) 

Напечатает либо:

ghi {'name': 'Tim', 'order': 1} 
def {'name': 'Allen', 'order': 2} 
abc {'name': 'Joey', 'order': 3} 

Или:

ghi {'order': 1, 'name': 'Tim'} 
def {'order': 2, 'name': 'Allen'} 
abc {'order': 3, 'name': 'Joey'} 

В случае, если вы просто хотите вывести/распечатать словарь словарей в точном порядке, который вы указали, это будет работать:

for k, v in sorted(dct_of_dcts.items(), key=lambda e: e[1]["order"]): 
    print(k, sorted(v.items())) 

Выход:

ghi [('name', 'Tim'), ('order', 1)] 
def [('name', 'Allen'), ('order', 2)] 
abc [('name', 'Joey'), ('order', 3)] 
1
from _collections import OrderedDict 
d = {"abc":{"name":"Joey","order":3}, 
    "def":{"name":"Allen","order":2}, 
    "ghi":{"name":"Tim","order":1}} 
_sorted = OrderedDict(sorted(d.items(), key=lambda x: x[1]["order"])) 

Тогда:

print(_sorted) 
OrderedDict([('ghi', {'order': 1, 'name': 'Tim'}), ('def', {'order': 2, 'name': 'Allen'}), ('abc', {'order': 3, 'name': 'Joey'})]) 

И:

print(_sorted["ghi"]) 
{'order': 1, 'name': 'Tim'} 

словари неупорядоченный, если вы хотите один, который заказанный вы должны использовать OrderedDict.

1

Вы можете использовать OrderedDict

from collections import OrderedDict 

dic = { 'abc': { 'name': 'Joey', 'order': 3 }, 'def': { 'name': 'Allen', 'order': 2 }, 'ghi': { 'name': 'Tim', 'order': 1 } } 

order_dic = OrderedDict(sorted(dic.items(), key=lambda x: x[1]['order'], reverse=False))