2017-02-15 1 views
1

Как отсортировать многоуровневый словарь python по его значению?Как отсортировать многоуровневый словарь по его значению?

test_dict = {'Items1':{'name':'Homer', 'age':39},'Items2':{'name':'Bart', 'age':10},'Items3':{'name':'Json','age':20}} 

после сортировки по 'возраст', он должен быть

test_dict = {'Items2':{'name':'Bart', 'age':10},'Items3':{'name':'Json','age':20},'Items1':{'name':'Homer', 'age':39}} 

Мои извинения за доставленные неудобства. Исправил вопрос.

+4

Держись, это не действует синтаксис: Вы имеете в виду '' деталей содержит список? –

+0

Словари не упорядочены по deffault, если вам нужно заказать 'OrderedDict' – Netwave

+0

Если вы говорите о' collections.OrderedDict', введите его явно. – 0Tech

ответ

2

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

Чтобы ответить на ваш вопрос, вы можете использовать pandas библиотеки, которая очень полезна для обработки данных, загружая ваши детали для панд, сортировать их и экспортировать обратно в упорядоченном словаре

import pandas as pd 
df = pd.DataFrame(test_dict) 
result = df.sort_values(by='age', axis=1, ascending=True).apply(OrderedDict) 

Результирующая с

Items2  {u'age': 10, u'name': u'Bart'} 
Items3  {u'age': 20, u'name': u'Json'} 
Items1 {u'age': 39, u'name': u'Homer'} 
+1

Здесь нет необходимости в пандах. Вы можете просто использовать отсортированные: test_dict ['Items'] = sorted (test_dict ['Items'], key = lambda x: x ['age']) –

+0

@ user2476373: Приношу свои извинения за неудобства. Исправил вопрос. – Jackie

+0

@GuillaumeA: Приношу свои извинения за доставленные неудобства. Исправил вопрос. – Jackie

1

Вы можете сделать это с библиотеками по умолчанию и sorted() метод:

from collections import OrderedDict 

test_dict = { 
    'Items1':{'name':'Homer', 'age':39}, 
    'Items2':{'name':'Bart', 'age':10}, 
    'Items3':{'name':'Json','age':20} 
} 

sorted_dict = OrderedDict() 
sorted_keys = sorted(test_dict, key=lambda x: test_dict[x]["age"])  

for key in sorted_keys: 
    sorted_dict[key] = test_dict[key] 

print(sorted_dict) 

Выход:

OrderedDict([('Items2', {'age': 10, 'name': 'Bart'}), ('Items3', {'age': 20, 'name': 'Json'}), ('Items1', {'age': 39, 'name': 'Homer'})]) 
+0

Выглядит очень просто :), без использования какой-либо внешней библиотеки. Должна быть какая-то разница в использовании панд !!!, но не уверен. Когда вы печатаете sorted_dict, он печатает как OrderedDict !!! Зачем ? Мои сомнения могут звучать очень глупо, но я очень новичок в python. – Jackie

+1

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

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