如何基于时间戳保留字符串列表中唯一文本的最新条目
问题:保留唯一文本且时间戳最新的条目
原始列表:
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
相关产品推荐
相关产品推荐

