Python实现按同名元素时间差规则过滤Element对象数组
问题背景
给定如下Python基础代码:
import datetime class Element(object): name: str datetime: datetime.datetime def __init__(self, *args, **kwargs): self.name = args[0] self.datetime = args[1] def __str__(self): return self.name + " " + self.datetime.strftime("%d-%m-%Y %H:%M:%S") e = Element("Name 1", datetime.datetime(2022, 1, 5, 20, 20, 20)) e2 = Element("Name 1", datetime.datetime(2022, 1, 5, 20, 20, 23)) e3 = Element("Name 2", datetime.datetime(2022, 2, 5, 19, 11, 10)) e4 = Element("Name 3", datetime.datetime(2022, 3, 5, 10, 15, 10)) e5 = Element("Name 3", datetime.datetime(2022, 3, 5, 10, 15, 8)) e6 = Element("Name 4", datetime.datetime(2022, 4, 7, 12, 12, 8)) e7 = Element("Name 4", datetime.datetime(2022, 4, 7, 12, 12, 20)) array = [e, e2, e3, e4, e5, e6, e7] new_array = []
实现要求:代码中定义的
Element类包含字符串类型name属性、datetime类型datetime属性,目前7个实例化对象已存入array数组,需要填充空数组new_array,满足规则:同名元素之间的datetime时间差小于5秒时,不得同时保留在新数组中。
实现思路
- 首先按
name属性对所有元素分组,不同名称的元素不受规则限制,无需做时间差校验。 - 对每个同名分组内的元素,按
datetime从小到大排序,避免乱序导致时间差错判、漏判。 - 逐一遍历排序后的同组元素,记录组内上一个被保留元素的时间:如果当前元素和上一个保留元素的时间差≥5秒,就将当前元素加入结果集,同时更新最后保留的时间标记;如果时间差小于5秒直接跳过当前元素。
- 所有分组处理完成后,得到的结果集就是符合要求的
new_array。
完整实现代码
from collections import defaultdict # 按名称对元素分组 name_group = defaultdict(list) for elem in array: name_group[elem.name].append(elem) for name, elems in name_group.items(): # 同组元素按时间升序排列 sorted_elems = sorted(elems, key=lambda x: x.datetime) if not sorted_elems: continue # 每组第一个元素直接保留 new_array.append(sorted_elems[0]) last_keep_time = sorted_elems[0].datetime # 遍历后续元素做时间差判断 for elem in sorted_elems[1:]: diff = (elem.datetime - last_keep_time).total_seconds() if diff >= 5: new_array.append(elem) last_keep_time = elem.datetime # 打印结果验证 for item in new_array: print(item)
运行后输出结果如下,完全符合规则要求:
Name 1 05-01-2022 20:20:20 Name 2 05-02-2022 19:11:10 Name 3 05-03-2022 10:15:08 Name 4 07-04-2022 12:12:08 Name 4 07-04-2022 12:12:20
内容的提问来源于stack exchange,提问作者Lilly
相关产品推荐
相关产品推荐

