Python中如何批量替换列表多个非切片指定位置的值?
问题:批量替换列表指定位置元素
给定两个列表:
a = [0,1,-1,3,4,-1,6,7,-1,9] b = [0,3,6,9,1,4,7,2,5,8]
需求:将b中的元素2、5、8(对应索引7、8、9)取出,替换a中对应位置的-1(对应索引2、5、8),最终期望a == [0,1,2,3,4,5,6,7,8,9]。
目前可行的写法是分三行赋值:
a[2] = b[7] a[5] = b[8] a[8] = b[9]
尝试使用a[2,5,8] = b[7,8,9]或a[2,5,8] = b[7:9]时,均报错TypeError: list indices must be integers or slices, not tuple,询问是否有更简洁的单行实现方式。
解决方案
1. 单行循环批量赋值(修改原列表)
把要替换的索引配对后用循环一次性完成,语法简洁且效率与多行赋值一致:
for idx_a, idx_b in zip([2,5,8], [7,8,9]): a[idx_a] = b[idx_b]
2. 列表推导式生成新列表(保留原列表)
如果不需要修改原列表,可通过字典映射和列表推导式生成目标列表,一行完成:
a = [{2: b[7], 5: b[8], 8: b[9]}.get(i, val) for i, val in enumerate(a)]
3. 利用numpy实现多索引赋值(适合大规模数据)
原生列表不支持多索引赋值,但numpy数组支持,数据量较大时效率更高:
import numpy as np a = np.array(a); a[[2,5,8]] = np.array(b)[[7,8,9]]; a = a.tolist()
内容的提问来源于stack exchange,提问作者John Timothy Heist
相关产品推荐
相关产品推荐

