Как создать список ключей во вложенном словаре на основе двух условий? - PullRequest
2 голосов
/ 07 апреля 2020

Допустим, у нас есть словарь:

 m_dict = {'2011-04-01': {'asprin': (232, -7, -4, 1), 'glucose': (3, 4, -3)},
           '2011-04-02': {'clb': (-7, -2, 8), 'humulin': (3, -6, -3), 'crack': (7,-5)},
           '2011-04-03': {'otc': (-1, 34, -45), 'tussin': (-2, 8)} }

Я пытаюсь отсортировать этот словарь в порядке убывания по количеству лекарств, которое хранится в дате, но если в двух датах одинаковое количество лекарств затем отсортируйте эти даты в порядке возрастания. Итак, список в этом случае должен быть: ['2011-04-02', '2011-04-01', '2011-04-03'].

Я понимаю, как сортировать по количеству лекарств, но путаюсь в том, как реализовать другое условие сортировки, если количество лекарств одинаково.

Как то так? Я пытаюсь сделать это в одном утверждении, используя комбинации понимания. Но это правило не применяется: если количество лекарств одинаково для двух дат, то сортируйте эти две даты в date_lst по возрастанию.

date_lst = [key for key in sorted(m_dict.keys(), key = lambda item[key]): len(item[key]))

Ответы [ 3 ]

5 голосов
/ 07 апреля 2020

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

date_lst = [key for key in sorted(m_dict.keys(), key=lambda k: (-len(m_dict[k]), k))]

Вывод:

['2011-04-02', '2011-04-01', '2011-04-03']

Обратите внимание, что вы можете просто использовать m_dict вместо m_dict.keys(), поскольку sorted работает с ключами при сортировке dict, а не со значениями (поскольку именно это dict возвращает в качестве итератора ). Таким образом, вы можете упростить до:

date_lst = [key for key in sorted(m_dict, key=lambda k: (-len(m_dict[k]), k))]
0 голосов
/ 08 апреля 2020

уже ответил, просто добавив itemgetter опцию оператора:

from operator import itemgetter

sorted([(key,len(value))[0] 
        for key,value in m_dict.items()]
       ,key=itemgetter(1),reverse=True)


['2011-04-01', '2011-04-02', '2011-04-03']
0 голосов
/ 07 апреля 2020

Попробуйте этот код.

sorted_key_list = sorted(m_dict.keys(), key = lambda t:len(m_dict[t].items()))

Если вы хотите создать словарь с порядком, используйте collections.OrderDict следующим образом.

from collections import OrderedDict
sorted_dic = OrderedDict()
for key in sorted_key_list:
    sorted_dic[key] = m_dict[key]
...