Python列表多个指定索引位置替换值 用列表推导式是否更优
结论:“列表推导式更好”的说法并不绝对,要根据你的使用场景判断
1. 两种实现的适用场景
你当前用的原地修改for循环是原生Python列表下最符合直觉的写法,完全没有问题,适合需要保留原列表内存地址、其他地方有引用该列表的场景。
如果允许生成新列表替换原有列表,确实可以用列表推导式实现,写法如下:
# 把索引列表转集合是为了提升in判断的效率,索引数量多的时候性能差距非常明显 indices_set = set(indices_list) mylist = [1 if idx in indices_set else 0 for idx in range(len(mylist))]
如果你的列表长度固定是46,也可以直接写range(46)代替range(len(mylist))。
2. 两种写法的优劣势对比
- 原有for循环优势:
- 逻辑直观,可读性强,所有Python开发者一眼就能看懂意图
- 原地修改列表,不会产生额外的内存占用,也不会影响其他引用了该列表的变量
- 当待赋值的索引数量远小于列表总长度时,执行效率更高:比如你这里只需要改4个元素,循环只跑4次,而列表推导式要遍历全部46个元素
- 列表推导式优势:
- 代码更简洁,一行完成逻辑
- 如果列表长度短、或者需要赋值的索引占比很高时,列表推导式因为是Python底层优化过的执行逻辑,比逐行解释的for循环执行速度更快
- 适合不需要保留原列表引用的场景,直接生成符合要求的新列表
额外补充
如果你允许引入第三方库,numpy数组原生支持你提到的索引列表批量赋值语法,写法更简单:
import numpy as np mylist = np.zeros(46, dtype=int) mylist[[0,30,40,41]] = 1 # 如果需要转回原生列表,加个tolist()即可:mylist = mylist.tolist()
内容的提问来源于stack exchange,提问作者DeltaIV
相关产品推荐
相关产品推荐

