如何用Python按先小时后天数规则排序字典列表?
按小时优先、天数次之的规则排序字典列表问题
我有一个字典列表,其中D代表天(Day),H代表小时(Hour)。需要按照先小时、后天数的规则对列表排序,但当前sorted函数的实现结果不符合预期,需调整代码得到目标排序结果。
原始列表与当前实现代码
my_list = [ {"key1":"123D", "key2":"123D"}, {"key1":"48H", "key2":"48H"}, {"key1":None, "key2":"154D"}, {"key1":"122D", "key2":"122D"}, {"key1":"5D", "key2":"5D"} ] sorted_list = sorted( my_list, key=lambda k: ( ( k["key1"] is None, int(k["key1"][:-1]) if k["key1"] else None, ), ( k["key2"] is None, int(k["key2"][:-1]) if k["key2"] else None, ), ), )
当前排序结果
[{'key1': '5D', 'key2': '5D'}, {'key1': '48H', 'key2': '48H'}, {'key1': '122D', 'key2': '122D'}, {'key1': '123D', 'key2': '123D'}, {'key1': None, 'key2': '154D'}]
期望排序结果
[{'key1': '48H', 'key2': '48H'}, {'key1': '5D', 'key2': '5D'}, {'key1': '122D', 'key2': '122D'}, {'key1': '123D', 'key2': '123D'}, {'key1': None, 'key2': '154D'}]
问题原因与解决方案
当前代码的排序key只提取了数值,没有区分H和D的优先级,导致5D(数值5)排在48H(数值48)前面。要实现小时优先的规则,需要在排序key中加入类型优先级标记:让H对应的标记值小于D,这样排序时H类型会优先排在前面。
修改后的代码如下:
sorted_list = sorted( my_list, key=lambda k: ( # 先处理key1的None情况,True会排在False后面 k["key1"] is None, # 标记类型:H对应0,D对应1,确保H优先 0 if k["key1"] and k["key1"].endswith("H") else 1 if k["key1"] else 1, # 提取数值用于排序 int(k["key1"][:-1]) if k["key1"] else 0, # 同理处理key2作为次要排序条件 k["key2"] is None, 0 if k["key2"] and k["key2"].endswith("H") else 1 if k["key2"] else 1, int(k["key2"][:-1]) if k["key2"] else 0, ), )
说明
优先级排序逻辑:
- 首先把
key1为None的项排在最后; - 然后区分时间类型:
H类型(标记0)排在D类型(标记1)前面; - 最后按数值大小升序排列;
- 若
key1相同,则按key2的同样规则进行次要排序。
- 首先把
执行修改后的代码,得到的结果与期望排序结果完全一致。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

