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

如何基于时间戳保留字符串列表中唯一文本的最新条目

问题:保留唯一文本且时间戳最新的条目

原始列表:

ls = ["2022-07-17 16:00:02 txt xyz", "2022-07-17 15:00:02 txt xyz", "2022-07-17 16:00:02 txt abc"]

预期结果:

ls = ["2022-07-17 16:00:02 txt xyz", "2022-07-17 16:00:02 txt abc"]

用户尝试的代码(注:原代码缺少datetime导入):

import re
import datetime

keep_message = {}
for i in range(len(ls)):
    timestamp_str = re.search(r"^(.*?) txt", ls[i]).group(1)
    timestamp = datetime.datetime.strptime(timestamp_str, "%Y-%m-%d %H:%M:%S")
    text = re.search(r"txt (.*?)$", ls[i]).group(1)
    keep_message[text + "_" + timestamp_str] = timestamp

keep_message_sorted = dict(sorted(keep_message.items(), key=lambda item: item[1]))

更优解决方案

核心思路是用文本内容作为字典的键,遍历过程中直接对比并保留每个文本对应的最新时间戳条目,一次遍历即可完成处理,效率更高。

实现方式一:使用datetime对象对比时间

import datetime
import re

ls = ["2022-07-17 16:00:02 txt xyz", "2022-07-17 15:00:02 txt xyz", "2022-07-17 16:00:02 txt abc"]

latest_entries = {}

for entry in ls:
    # 匹配时间戳和文本内容
    match = re.match(r"^(.*?) txt (.*)$", entry)
    if not match:
        continue  # 跳过格式不符合的条目
    
    timestamp_str, text = match.groups()
    timestamp = datetime.datetime.strptime(timestamp_str, "%Y-%m-%d %H:%M:%S")
    
    # 首次遇到该文本,或当前时间戳更新时替换条目
    if text not in latest_entries:
        latest_entries[text] = entry
    else:
        existing_ts_str = re.match(r"^(.*?) txt", latest_entries[text]).group(1)
        existing_timestamp = datetime.datetime.strptime(existing_ts_str, "%Y-%m-%d %H:%M:%S")
        if timestamp > existing_timestamp:
            latest_entries[text] = entry

result = list(latest_entries.values())
print(result)

实现方式二:直接对比时间戳字符串(更轻量)

由于YYYY-MM-DD HH:MM:SS格式的字符串可以直接按字典序比较大小(与时间顺序完全一致),因此可以省去datetime模块的导入,简化代码:

import re

ls = ["2022-07-17 16:00:02 txt xyz", "2022-07-17 15:00:02 txt xyz", "2022-07-17 16:00:02 txt abc"]

latest_entries = {}

for entry in ls:
    match = re.match(r"^(.*?) txt (.*)$", entry)
    if not match:
        continue
    
    timestamp_str, text = match.groups()
    
    if text not in latest_entries:
        latest_entries[text] = entry
    else:
        existing_ts_str = re.match(r"^(.*?) txt", latest_entries[text]).group(1)
        if timestamp_str > existing_ts_str:
            latest_entries[text] = entry

result = list(latest_entries.values())
print(result)

优化点说明

  • 直接以文本为键:避免了拼接字符串作为键的冗余操作,逻辑清晰,字典仅保留每个文本的最新条目。
  • 一次遍历完成处理:无需排序后去重,时间复杂度从O(n log n)降至O(n),大数据量场景下效率提升显著。
  • 增加格式校验:通过if not match跳过非法格式条目,提升代码鲁棒性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:18:21