Python实现含缺失datetime的用户列表按指定规则排序
解决带日期/无日期用户列表的定制排序问题
Hey,我刚好能帮你搞定这个排序需求!先明确你的核心规则:
- 带日期的用户要按 修改后的ISO 8601格式(月-日 时:分:秒) 升序排列
- 无日期用户要尽可能保留原位置,仅当无日期用户下方的带日期用户,其上方存在比它更大的日期时,这个带日期用户才可以上移越过无日期用户
思路解析
这个需求本质是带条件的冒泡排序变种:
- 先把原始字符串解析成包含用户和对应日期对象的列表(无日期用户标记为
None) - 遍历每个带日期用户,向前检查:
- 如果前一个是无日期用户,就查找该无日期用户上方最近的带日期用户,判断是否存在比当前用户日期更大的记录
- 如果存在更大日期,就将当前用户上移一位;如果前一个是带日期用户且日期更大,也上移(常规冒泡排序逻辑)
- 直到当前用户无法再上移为止
完整代码实现
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
相关产品推荐
相关产品推荐

