如何用单行代码替代删除列表中指定字典元素的for循环
字典列表匹配id删除元素的替代实现方案
问题背景
现有删除字典列表中匹配指定id元素的实现如下:
Data = [{"name": "Gill","age": "20", "id":"10001", "gender": "female"}, {"name": "Rakshit", "age": "22", "id":"10002"}] new_Data = {"id":"10001"} for i, x in enumerate(Data): if x['id'] == new_Data['id']: del Data[i]
需要寻找单行代码或者更优的替代方案。
方案1:列表推导式(最推荐,单行实现)
直接生成过滤后的新列表覆盖原变量,没有遍历删除的索引错位隐患,可读性和性能都最优:
Data = [item for item in Data if item['id'] != new_Data['id']]
方案2:原地删除单行实现(必须修改原列表时使用)
如果场景要求必须在原列表上修改而不是生成新列表,可以用next匹配索引后删除:
del Data[next(i for i, item in enumerate(Data) if item['id'] == new_Data['id'])]
注意:该写法默认列表中一定存在匹配的id,若无匹配项会抛出
StopIteration异常。兼容无匹配场景的写法如下:match_idx = next((i for i, item in enumerate(Data) if item['id'] == new_Data['id']), None) if match_idx is not None: del Data[match_idx]
补充说明
原遍历删除的写法存在逻辑缺陷:遍历列表过程中删除元素会导致列表长度动态变化、索引错位,若存在多个匹配id时会出现漏删的情况,不推荐使用。
内容的提问来源于stack exchange,提问作者BISWAJIT RAKSHIT
相关产品推荐
相关产品推荐

