【问题标题】:How to create a list of keys in a nested dictionary based on two conditions?如何根据两个条件在嵌套字典中创建键列表?
【发布时间】:2020-07-19 04:14:01
【问题描述】:

假设我们有一本字典:

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

【问题讨论】:

标签: python sorting dictionary nested list-comprehension


【解决方案1】:

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

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

【讨论】:

  • 这里不需要.keys()
  • 是的!我明白了,谢谢。首先检查长度,如果两个键值的长度相等,则将检查这些指定键的排序。
  • @M.Cow 完全正确!
【解决方案2】:

试试这个代码。

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]

【讨论】:

    【解决方案3】:

    已经回答了,只需添加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']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      相关资源
      最近更新 更多