如何用更简洁高效的方式将列表中索引模4>1的元素取反?
几种更简洁高效的实现方式
1. 切片批量赋值(修改原列表)
利用Python切片的步进特性,直接定位到需要取反的位置(索引2、3、6、7...),批量赋值取反后的值,这种方式底层经过优化,比手动循环效率更高:
# 假设L已经是初始的正整数列表 L[2::4] = (-x for x in L[2::4]) L[3::4] = (-x for x in L[3::4])
这里用生成器表达式(-x for x ...)代替列表推导式,能避免创建临时列表,节省内存,尤其当n很大时效果更明显。
2. 列表推导式(生成新列表)
如果不需要保留原列表,用列表推导式可以一行生成目标列表,可读性极强:
L_prime = [x if i % 4 < 2 else -x for i, x in enumerate(L)]
通过enumerate同时获取索引和元素,根据索引对4取余的结果判断是否取反,逻辑和原循环完全一致,但代码更紧凑。
对比原循环
原for循环逻辑清晰,但上述两种方式在代码简洁度和性能上更有优势:切片操作跳过了Python层面的循环判断,直接调用底层优化的操作;列表推导式则是Python中生成列表的高效写法,比手动for循环更快。
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

