Python列表推导式:按等长布尔列表条件提取元素并移除原列表对应项
解决方法
首先给定初始数据:
a = [0.42, 0.18, 1.54, 2.9, 1.81, 2.35, 0.18, 1.54, 2.92] mask = [False, True, False, False, False, False, True, False, False]
实现代码(全列表推导式实现)
仅需两行列表推导式即可同时满足两个需求,且不会出现遍历删除时的索引偏移问题:
# 需求1:提取mask为True对应元素到新列表 new_list = [val for val, flag in zip(a, mask) if flag] # 需求2:过滤原数组,移除mask为True的元素 a = [val for val, flag in zip(a, mask) if not flag]
结果验证
- 生成的
new_list结果为[0.18, 0.18] - 处理后的
a结果为[0.42, 1.54, 2.9, 1.81, 2.35, 1.54, 2.92]
额外说明
如果你需要修改原列表的内存对象(而非重新赋值变量),可以先收集待删除的索引再倒序弹出:
del_idx = [i for i, flag in enumerate(mask) if flag] new_list = [a[i] for i in del_idx] # 倒序弹出避免索引错位 for i in reversed(del_idx): a.pop(i)
内容的提问来源于stack exchange,提问作者Lukas Pfeiffer
相关产品推荐
相关产品推荐

