首页 > 解决方案 > 如何根据两个条件在嵌套字典中创建键列表?

问题描述

假设我们有一本字典:

 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]))

标签: pythonsortingdictionarynestedlist-comprehension

解决方案


您可以按值的元组、字典元素的长度(取反以降序排序)和键对列表进行排序:

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']

请注意,在对 a 进行排序时,您可以只使用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))]

推荐阅读