假设我们有一本字典:
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]))
发布于 2020-04-07 11:06:41
您可以按值的元组、字典元素的长度(取反以降序排序)和键对列表进行排序:
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))]
发布于 2020-04-07 11:07:00
试试这段代码。
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]
发布于 2020-04-08 14:05:19
我已经回答了,只需加上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']
https://stackoverflow.com/questions/61072085
复制相似问题