Сортировка вложенного словаря по значению и остатка по другому значению в Python

рассмотрим этот формат словаря.

{'KEY1':{'name':'google','date':20100701,'downloads':0},
 'KEY2':{'name':'chrome','date':20071010,'downloads':0},
 'KEY3':{'name':'python','date':20100710,'downloads':100}}

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

['KEY3','KEY1','KEY2']

Я уже могу отсортировать список по любому значению, используя sorted, но как Сортировать по второму значению?

4 ответов


использовать на sorted(). Он позволяет указать функцию, которая, учитывая фактический сортируемый элемент, возвращает значение, которое должно быть Отсортировано. Если это значение является кортежем, то оно сортируется как кортежи сортируются по первому значению, а затем по второму значению.

sorted(your_list, key=lambda x: (your_dict[x]['downloads'], your_dict[x]['date']))

вы можете пройти


другой мой ответ был неправильным (как и большинство ответов здесь)

sorted_keys = sorted((key for key in outer_dict if outer_dict[key]['downloads']),
                     key=lambda x: (outer_dict[key]['downloads'],
                                    outer_dict[key]['downloads'])
                     reverse=True)

sorted_keys += sorted((key for key in outer_dict if not outer_dict[key]['downloads']),
                      key=lambda x: outer_dict[key]['date'])

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

но на самом деле, последняя часть Эли Courtwrights ответ самый лучший.


a = {'KEY1':{'name':'google','date':20100701,'downloads':0},
 'KEY2':{'name':'chrome','date':20071010,'downloads':0},
 'KEY3':{'name':'python','date':20100710,'downloads':100}}


z = a.items()

z.sort(key=lambda x: (x[1]['downloads'], x[1]['date']))