You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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,
    ),
)

说明

  1. 优先级排序逻辑:

    • 首先把key1为None的项排在最后;
    • 然后区分时间类型:H类型(标记0)排在D类型(标记1)前面;
    • 最后按数值大小升序排列;
    • 若key1相同,则按key2的同样规则进行次要排序。
  2. 执行修改后的代码,得到的结果与期望排序结果完全一致。

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:54:33