如何删除列表中id匹配指定列表的字典,是否必须使用两层循环?
列表过滤需求实现方案
现有数据
待匹配id列表
idlist = ['101', '102']
待处理字典列表
myd = [ {'id':'101', 'role': 'tester'}, {'id':'102', 'role': 'tester'}, {'id':'103', 'role': 'tester'} ]
需求说明
- 校验字典列表中的id是否存在于待匹配id列表中
- 删除id匹配的条目,最终输出
[{'id':'103', 'role': 'tester'}]
原代码的问题
你写的代码存在几个明显问题,本身无法运行也达不到预期效果:
- myd是列表类型,没有
items()方法,直接遍历myd本身即可 - if判断语句末尾缺少冒号,属于语法错误
- 遍历列表过程中直接删除元素会导致索引偏移,大概率出现漏删
del each删除的只是遍历生成的临时变量,根本不会修改原列表的内容
不需要两层循环的实现方案
完全不需要写两层循环,更高效的实现方式如下:
首先把待匹配的id列表转成集合,利用集合O(1)的查询效率优化性能,再用列表推导式做一层过滤即可:
# 转成集合提升查询效率,id量越大优势越明显 exclude_ids = set(idlist) # 直接过滤生成符合要求的新列表 myd = [item for item in myd if item['id'] not in exclude_ids]
运行后myd的结果就是你要的[{'id':'103', 'role': 'tester'}]。
这种方式时间复杂度只有O(n)(n为字典列表的长度),比两层循环的O(n*m)(m为id列表长度)性能高很多,代码也更简洁易读。
内容的提问来源于stack exchange,提问作者sim
相关产品推荐
相关产品推荐

