python - 如何根据两个条件在嵌套字典中创建键列表?

标签 python sorting dictionary nested list-comprehension

假设我们有一本字典:

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

最佳答案

您可以按值元组、字典元素的长度(否定以降序排序)然后按键对列表进行排序:

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

请注意,自 sorted 起,您可以只使用 m_dict 而不是 m_dict.keys()dict 进行排序时对键进行操作,而不是对值进行操作(因为这是 dict 作为迭代器返回的值)。所以你可以简化为:

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

关于python - 如何根据两个条件在嵌套字典中创建键列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61072085/

相关文章:

c++ - 标记化字符串时出现段错误

python - 如何在 PyCharm 中的单个文件而不是项目中工作

android - Android 上的两种方式 SSL 身份验证

python - 如何在 Flask 中获取自定义 SELECT 查询?

java - 如何返回给定 HashMap 的有序列表?

JavaScript - 如何对 div 进行排序

java - 如何根据 myobject 的属性对 ArrayList<myobject> 进行排序

python - 在python中合并两个字典

c++ - 将 std::tuple 插入 std::map

python - 存储在列表中的循环中的 Lambda,仅打印最后一个循环评估的值,而不打印与所有循环迭代不同的值