Python遍历字典匹配host移除重复项 列表长度不等问题解决
需求说明
需要从存储的字典列表中,移除所有host值与请求列表中host值匹配的条目,两类数据结构如下:
请求数据格式:
req= [{"host":"usr1"}, {"host":"usr7"}, {"host":"usr10"}, {"host":"usr11"}, {"host":"usrx...."}, ..../more hosts]
存储数据格式:
data = [ { "host": "usr1", "address": "x" }, { "host": "usr2", "address": "y" }, { "host": "usr3", "address": "z" } .../ more hosts ]
原实现的问题
原代码使用zip(data, req)并行遍历两个列表存在两个核心缺陷:
zip会自动以两个列表中更短的长度为准截断遍历,长列表里超出的部分完全不会被处理- 逻辑是按位置一一对比同索引下的host值,不是全局匹配host字段,只要两个列表元素顺序不一致,哪怕长度相同也会匹配错误
正确实现
优先先提取所有待删除的host为集合(集合成员判断的时间复杂度为O(1),远高于列表遍历的O(n),数据量越大优势越明显),再过滤原数据列表即可,完全不受两个列表的长度、元素顺序影响:
# 提取所有需要删除的host为集合 to_remove = {item["host"] for item in req} # 过滤原数据,仅保留不在删除列表里的条目 new_static = [entry for entry in data if entry["host"] not in to_remove]
如果不习惯列表推导式写法,也可以用普通循环实现,逻辑完全一致:
to_remove = set() for req_item in req: to_remove.add(req_item["host"]) new_static = [] for data_item in data: if data_item["host"] not in to_remove: new_static.append(data_item)
注意不要在遍历原data列表的同时直接删除列表内元素,会导致列表索引偏移,出现漏删、错删问题。
内容的提问来源于stack exchange,提问作者yasa
相关产品推荐
相关产品推荐

