Python:如何按条件向数组中追加符合要求的嵌套记录?
过滤嵌套列表的实现方案
需求说明
处理包含[id, msg_key, msg_value, date]的嵌套列表,仅保留满足以下条件的记录:
- 对于当前记录,与它同id、同msg_key的上一条记录,
msg_value和当前记录不同; - 每个
(id, msg_key)组合的第一条记录直接保留。
示例输入
events = [ [1, "foo", "bar", 709], [1, "foo", "bar2", 710], [1, "foo", "bar", 711], [1, "foo", "bar2", 712], [1, "foo", "bar", 713], [2, "foo", "toto", 714], [1, "foo", "bar", 715], [1, "foo", "bar2", 716] ]
期望输出
events_filtered = [ [1, "foo", "bar", 709], [1, "foo", "bar2", 710], [1, "foo", "bar", 711], [1, "foo", "bar2", 712], [1, "foo", "bar", 713], [2, "foo", "toto", 714], [1, "foo", "bar2", 716] ]
完整实现代码
通过一个字典跟踪每个(id, msg_key)组合的最新msg_value,补全循环的判断逻辑:
out_array = [] # 用字典存储每个(id, msg_key)组合对应的最后一次msg_value last_values = {} for event in events: event_id, msg_key, msg_value, date = event # 生成唯一标识组合的键 key = (event_id, msg_key) # 判断条件:组合未出现过,或当前值与上一次不同 if key not in last_values or last_values[key] != msg_value: out_array.append(event) # 更新该组合的最新值 last_values[key] = msg_value
逻辑说明
last_values字典的作用是记录每个(id, msg_key)组合最近一次出现的msg_value,避免每次回溯遍历列表,提升效率;- 遍历每条记录时,先解构出四个字段,生成组合键;
- 满足以下任一条件就保留记录:
- 该
(id, msg_key)组合是第一次出现; - 当前记录的
msg_value和该组合上一次的msg_value不一样;
- 该
- 保留记录后,立即更新字典中对应组合的最新
msg_value,确保下一次判断的准确性。
内容的提问来源于stack exchange,提问作者Stéphane GRILLON
相关产品推荐
相关产品推荐

