背景
我有两个列表,第一个items
包含大约 250 个元组,每个元组包含 3 个元素
(path_to_a_file, size_in_bytes, modified_time)
第二个列表result
包含最多 250 个元素,这是数据库查询的结果,该查询根据列表中的路径查找行items
。元素的数量result
取决于这些文件是否已经在数据库中。
结果中的每个元素都是从 SQLAlchemy 查询返回的行对象,其中包含行值的属性,(path
,mtime
并且hash
是我在这里感兴趣的)
我正在尝试做的是过滤掉其中具有相同 mtime 的所有元素items
(results
并跟踪过滤的数量和总大小),并创建一个新列表,其中包含具有不同 mtime 或不具有不同 mtime 的项目存在于result
. 需要存储具有不同 mtime 的(path,size,mtime_from_result,hash_from_result)
项目以及不在数据库中的项目(path,size,mtime,None)
。
我希望我没有把它过于本地化,但我觉得我需要解释我想要完成的问题才能提出这个问题。
问题
我想尝试让这个循环尽可能快,但最重要的部分是让它按预期工作。
当我遍历它们时从列表中删除项目是否安全?我注意到向前迭代有一个奇怪的结果,但向后迭代似乎没问题。有更好的方法吗?
我正在删除我匹配的项目(i.path == j[0]
)因为我知道关系是 1 到 1 并且它不会再次匹配所以通过减少列表我可以在下一次迭代中更快地迭代它,更重要的是我得到留下所有不匹配的项目。
我不禁觉得我忽略了一个更好的解决方案,也许是列表理解或生成器。
send_items=[]
for i in result[::-1]:
for j in items[::-1]:
if i.path==j[0]:
result.remove(i) #I think this remove is possibly pointless?
items.remove(j)
if i.mtime==j[2]:
self.num_skipped+=1
self.size_skipped+=j[1]
else:
send_items.append((j[0],j[1],i.mtime,i.hash))
break
send_items.extend(((j[0],j[1],j[2],None) for j in items))