#python #sorting #dictionary
Вопрос:
Я пытаюсь отсортировать словарь внутри словаря. Моя цель состоит в том, чтобы отсортировать словарь «дополнительный» [«дополнительный»] на основе его значений, от высокого до низкого.Проблема, с которой я сталкиваюсь, заключается в том, что мой «вспомогательный» словарь вложен глубоко в основной словарь. Используя другие примеры, я могу сделать это на один уровень выше, см. Мой код ниже. Поэтому вместо сортировки «отметок» я хотел бы отсортировать элементы 1,2 и 3 на основе их значений. Код:
# initializing dictionary
test_dict = {'Nikhil' : { 'roll' : 24, 'marks' : 17, 'extra' : {'item1': 2, 'item2': 3, 'item3': 5}},
'Akshat' : {'roll' : 54, 'marks' : 12, 'extra' : {'item1': 8, 'item2': 3, 'item3': 4}},
'Akash' : { 'roll' : 12, 'marks' : 15, 'extra' : {'item1': 9, 'item2': 3, 'item3': 1}}}
# printing original dict
print("The original dictionary : " str(test_dict))
# using sorted()
# Sort nested dictionary by key
res = sorted(test_dict.items(), key = lambda x: x[1]['marks'])
# print result
print("The sorted dictionary by marks is : " str(res))
# How to sort on 'extra'?
Так вот как я хочу, чтобы это выглядело:
sorted_dict = {'Nikhil' : { 'roll' : 24, 'marks' : 17, 'extra' : {'item3': 5, 'item2': 3, 'item1': 2}},
'Akshat' : {'roll' : 54, 'marks' : 12, 'extra' : {'item1': 8, 'item3': 4, 'item2': 3}},
'Akash' : { 'roll' : 12, 'marks' : 15, 'extra' : {'item1': 9, 'item2': 3, 'item3': 1}}}
Комментарии:
1. Хотя словари остаются в порядке вставки в последних версиях Python, по-прежнему рекомендуется использовать тип с реальным порядком. Рассмотрите возможность использования списка а
collections.OrderedDict
.2. @КлаусД. у вас есть какие-нибудь примеры этого?
3. Нет, речь идет о порядке элементов *item1, item2, item3) в sorted_dict: они отсортированы от наибольшего к наименьшему. Это не относится к тестовому диктанту. Вопрос в том, как это сделать.
4. Ждать… вы не хотите изменять порядок , в котором
item1
item2
item3
отображаются,, но вы хотите изменить, какие значения связаны с ними? Тогда почему у вас нет списка? Нравится'extra': [5, 3, 2]
?5. Нет, речь идет о заказе, а затем посмотрите, какое число/значение связано с ним. Я хочу увидеть ключ (пункт 1/2/3) и связанное с ним значение, но просто упорядочите от наибольшего к наименьшему. В моем «реальном» примере у меня иногда есть пункт 1 до сих пор … пункт 20, и я хочу сначала выбрать те, которые имеют наибольшее значение, так как они более актуальны
Ответ №1:
Ну, это, кажется, делает это:
test_dict = {
'Nikhil': {'roll': 24, 'marks': 17, 'extra': {'item1': 2, 'item2': 3, 'item3': 5}},
'Akshat': {'roll': 54, 'marks': 12, 'extra': {'item1': 8, 'item2': 3, 'item3': 4}},
'Akash': {'roll': 12, 'marks': 15, 'extra': {'item1': 9, 'item2': 3, 'item3': 1}}
}
sorted_dict = test_dict.copy()
for name in test_dict:
extra = test_dict[name]['extra']
sorted_extra = dict(reversed(sorted(extra.items(), key=lambda item: item[1])))
sorted_dict[name]['extra'] = sorted_extra
Комментарии:
1. вы можете перейти
reverse=True
к отсортированному для обратной сортировки.
Ответ №2:
это сортирует значения, но не ключи «дополнительного» дикта для всех диктов в большом словаре:
test_dict = {
'Nikhil': {'roll': 24, 'marks': 17, 'extra': {'item1': 2, 'item2': 3, 'item3': 5}},
'Akshat': {'roll': 54, 'marks': 12, 'extra': {'item1': 8, 'item2': 3, 'item3': 4}},
'Akash': {'roll': 12, 'marks': 15, 'extra': {'item1': 9, 'item2': 3, 'item3': 1}}
}
for dct in test_dict.values():
extra_keys, extra_values = dct['extra'].keys(), dct['extra'].values()
dct['extra'] = dict(zip(extra_keys, sorted(extra_values, reverse=True)))
print(test_dict)
выход:
{'Nikhil': {'roll': 24, 'marks': 17, 'extra': {'item1': 5, 'item2': 3, 'item3': 2}},
'Akshat': {'roll': 54, 'marks': 12, 'extra': {'item1': 8, 'item2': 4, 'item3': 3}},
'Akash': {'roll': 12, 'marks': 15, 'extra': {'item1': 9, 'item2': 3, 'item3': 1}}}
Ответ №3:
То же самое можно достичь и с помощью понимания списка
test_dict = {
'Nikhil': {'roll': 24, 'marks': 17, 'extra': {'item1': 2, 'item2': 3, 'item3': 5}},
'Akshat': {'roll': 54, 'marks': 12, 'extra': {'item1': 8, 'item2': 3, 'item3': 4}},
'Akash': {'roll': 12, 'marks': 15, 'extra': {'item1': 9, 'item2': 3, 'item3': 1}}
}
result = {
k: {
m: dict(sorted(n.items(), reverse=True, key=lambda x: x[1]))
if m == 'extra' else n
for (m, n) in v.items()
} for (k, v) in test_dict.items()
}
print(result)
Ответ №4:
отсортируйте внутренний диктант и назначьте его test_dict[key]['extra']
.. просто с петлей
for key in test_dict.keys():
test_dict[key]["extra"] = dict(sorted(test_dict[key]["extra"].items(), key=itemgetter(1), reverse=True))
чем вывод test_dict будет таким
{
'Nikhil': {'roll': 24, 'marks': 17, 'extra': {'item3': 5, 'item2': 3, 'item1': 2}},
'Akshat': {'roll': 54, 'marks': 12, 'extra': {'item1': 8, 'item3': 4, 'item2': 3}},
'Akash': {'roll': 12, 'marks': 15, 'extra': {'item1': 9, 'item2': 3, 'item3': 1}}
}