Как отсортировать словарь по значению вложенного словаря без указания ключа?
Есть словарь:
{'a': {'139': '88943'},
'b': {'138': '9677'},
'c': {'135': '85039'}}
Необходимо отсортировать его по второму значению от меньшего к большему. Понимаю, что результат лежит через цикл for, но не могу его никак сформулировать. Важно! Все ключи и значения формируются из переменных. Поэтому задействовать какую либо привязку к ключам нельзя. Необходимо получить результат в виде:
{'b': {'138': '9677'},
'c': {'135': '85039'},
'a': {'139': '88943'}}
Подскажите, как это сделать или хотя бы, с чего начать.
Полный код функции.
def logic_to_buy():
ddct_specific.update(ddct_sb)
ddct_specific.update(ddct_tn)
# Оставляет в словаре только те значения, которые больше 1000.
my_data = ddct_specific
new_data = {}
for key, value in my_data.items():
if int(list(value.values())[0]) > 1000:
new_data.update({key: value})
Ответы (2 шт):
попробуйте так:
dict_ = {
'b': {'138': '9677'},
'c': {'135': '85039'},
'a': {'139': '88943'}
}
list_ = list(dict_.items())
list_.sort(key = lambda x: int(x[1][list(x[1].keys())[0]]))
dict_ = dict(list_)
list(dict_.items())создаём список вида[(key1, value1), (key2, value2)]list(x[1].keys())[0]получаем все ключи и превращаем в список чтобы можно было брать элементы по индексу, и берём первый ключint(x[1]берём строку и превращаем в число
вот немного изменённая версия:
def f(x):
x = x[1]
x = list(x.values())[0]
print(x)
return int(x)
dict_ = {
'a': {'139': '88943'},
'b': {'138': '9677'},
'c': {'135': '85039'}
}
list_ = list(dict_.items())
list_.sort(key = f)
dict_ = dict(list_)
for key, value in dict_.items():
print(key, value)
Дополлнение к ответу @Danis
Словари в Python до 3.7 не гарантируют свою последовательность, то есть неважно как вы добавили ключи они при кадом запросе обекта могут быть расположенны случайным образом.
Если для вас критична сортировка лучше использовать отдельный list с ключами в который записать вашу сортировку то есть:
{'a': {'139': '88943'},
'b': {'138': '9677'},
'c': {'135': '85039'}}
и к нему еще:
sort_list = ['b', 'c', 'a']
Реализация:
data = {
'a': {'139': '88943'},
'b': {'138': '9677'},
'c': {'135': '85039'}
}
list_by_dict = list(data.items())
list_by_dict.sort(key=lambda x: int(x[1][list(x[1].keys())[0]]))
sort_dict_key = [i[0] for i in list_by_dict]
# > ['b', 'c', 'a']
и для итерации мы уже используем sort_dict_key, а не нас основной словарь.
Также в CPython 3.7 как фичу реализовали сохранения структуры словарей, то есть они гарантированно сохраняют свою последовательность.
Дока:
Changed in version 3.7: As a dict subclass, Counter Inherited the capability to remember insertion order. Math operations on Counter objects also preserve order. Results are ordered according to when an element is first encountered in the left operand and then by the order encountered in
https://docs.python.org/3/library/collections.html#collections.OrderedDict