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

Python实现含缺失datetime的用户列表按指定规则排序

解决带日期/无日期用户列表的定制排序问题

Hey,我刚好能帮你搞定这个排序需求!先明确你的核心规则:

  • 带日期的用户要按 修改后的ISO 8601格式(月-日 时:分:秒) 升序排列
  • 无日期用户要尽可能保留原位置,仅当无日期用户下方的带日期用户,其上方存在比它更大的日期时,这个带日期用户才可以上移越过无日期用户

思路解析

这个需求本质是带条件的冒泡排序变种:

  1. 先把原始字符串解析成包含用户和对应日期对象的列表(无日期用户标记为None)
  2. 遍历每个带日期用户,向前检查:
    • 如果前一个是无日期用户,就查找该无日期用户上方最近的带日期用户,判断是否存在比当前用户日期更大的记录
    • 如果存在更大日期,就将当前用户上移一位;如果前一个是带日期用户且日期更大,也上移(常规冒泡排序逻辑)
    • 直到当前用户无法再上移为止

完整代码实现

from datetime import datetime

def sort_user_list(input_str):
    # 第一步:解析原始字符串为(user, date_obj)列表
    tokens = input_str.split()
    items = []
    i = 0
    while i < len(tokens):
        user = tokens[i]
        # 尝试解析后续两个token为日期时间
        if i + 2 < len(tokens):
            date_str = f"{tokens[i+1]} {tokens[i+2]}"
            try:
                # 补充年份(这里用2024,可根据需求调整)
                date_obj = datetime.strptime(date_str, "%m-%d %H:%M:%S").replace(year=2024)
                items.append((user, date_obj))
                i += 3
                continue
            except ValueError:
                # 解析失败,说明当前user无日期
                pass
        items.append((user, None))
        i += 1

    # 第二步:带条件的冒泡排序,实现定制规则
    for i in range(1, len(items)):
        current_user, current_date = items[i]
        if current_date is not None:
            j = i
            while j > 0:
                prev_user, prev_date = items[j-1]
                if prev_date is None:
                    # 查找当前无日期用户上方最近的带日期用户
                    k = j - 2
                    has_larger_date = False
                    while k >= 0:
                        u, d = items[k]
                        if d is not None:
                            if d > current_date:
                                has_larger_date = True
                            break
                        k -= 1
                    # 如果上方有更大日期,允许上移
                    if has_larger_date:
                        items[j], items[j-1] = items[j-1], items[j]
                        j -= 1
                    else:
                        break
                else:
                    # 前一个是带日期用户,常规冒泡排序(日期大的往后移)
                    if prev_date > current_date:
                        items[j], items[j-1] = items[j-1], items[j]
                        j -= 1
                    else:
                        break

    # 第三步:将结果转化为目标字符串格式
    output_tokens = []
    for user, date in items:
        output_tokens.append(user)
        if date is not None:
            output_tokens.append(date.strftime("%m-%d %H:%M:%S"))
    return ' '.join(output_tokens)

# 测试你的输入
input_str = "user1 04-24 19:01:00 user2 04-25 06:39:59 user3 user4 04-24 22:11:34 user5 user6 user7 04-26 10:27:36 user8 04-25 06:09:01"
print(sort_user_list(input_str))

输出结果

运行代码后,你会得到完全符合预期的排序结果:

user1 04-24 19:01:00 user4 04-24 22:11:34 user8 04-25 06:09:01 user2 04-25 06:39:59 user3 user5 user6 user7 04-26 10:27:36

代码说明

  • 解析部分:自动识别用户是否带日期,将日期字符串转化为datetime对象方便比较
  • 排序部分:结合了冒泡排序的核心逻辑,同时加入了无日期用户的特殊判断,确保只有符合条件的带日期用户才能上移
  • 输出部分:将处理后的列表还原为你需要的字符串格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:00:07