如何解决嵌套循环提取更新条目时的重复问题?
解决日期更新条目筛选的问题
首先看你的需求:从update列表里找出那些在old列表中存在相同ID,但日期更新的条目。你的原代码出现了重复且结果不符合预期的问题,主要有几个原因,我们一步步来解决。
原代码的问题分析
- 变量名错误:你代码里用了
alt,但实际应该遍历的是old列表吧? - 错误添加了整个列表:你写的
updated_urls.append(update),这会把整个update列表添加进去,而不是当前匹配到的单个条目l。 - 嵌套循环导致重复:因为
old里有两个条目(ID45、42)和update匹配,每次匹配都会触发一次添加,所以最终结果里出现了两次完整的update列表。
高效的解决方案:用字典优化查找
最简洁高效的方式是先把old列表转换成字典,用ID作为键,日期作为值,这样可以快速查找每个ID对应的旧日期,避免嵌套循环:
import datetime update = [[45, datetime.datetime(2019, 11, 14, 0, 0)], [42, datetime.datetime(2019, 11, 14, 0, 0)], [44, datetime.datetime(2019, 11, 13, 0, 0)]] old = [[45, datetime.datetime(2019, 11, 13, 0, 0)], [42, datetime.datetime(2019, 11, 13, 0, 0)], [44, datetime.datetime(2019, 11, 13, 0, 0)]] # 将old转换为字典,键是ID,值是对应的旧日期 old_date_map = {item[0]: item[1] for item in old} # 筛选update中日期比旧日期新的条目 updated_urls = [item for item in update if old_date_map.get(item[0]) < item[1]] print(updated_urls) # 输出:[[45, datetime.datetime(2019, 11, 14, 0, 0)], [42, datetime.datetime(2019, 11, 14, 0, 0)]]
修正原代码的版本(如果不想用字典)
如果你想基于原有的循环逻辑修改,需要注意两点:添加单个条目l,并且避免重复添加:
import datetime update = [[45, datetime.datetime(2019, 11, 14, 0, 0)], [42, datetime.datetime(2019, 11, 14, 0, 0)], [44, datetime.datetime(2019, 11, 13, 0, 0)]] old = [[45, datetime.datetime(2019, 11, 13, 0, 0)], [42, datetime.datetime(2019, 11, 13, 0, 0)], [44, datetime.datetime(2019, 11, 13, 0, 0)]] updated_urls = [] # 修正变量名为old for line in old: for l in update: if line[0] == l[0] and l[1] > line[1]: # 检查是否已经添加过该条目,避免重复 if l not in updated_urls: updated_urls.append(l) print(updated_urls)
不过这种方法的效率不如字典方案,因为嵌套循环是O(n*m)的时间复杂度,而字典方案是O(n+m),数据量大的时候差异会很明显。
内容的提问来源于stack exchange,提问作者gython
相关产品推荐
相关产品推荐

