不要想太多。 这是一个例子,列表推导、函数等等都是多余的。您需要遍历一个列表,并就地修改它,对吧?所以你没有修改你正在迭代的结构。迭代目标其实就是列表的索引。
xs = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(xs)
for idx in range(2, len(xs), 3):
if xs[idx] % 2 == 1:
xs[idx] -= 1
print(xs)
这相当于许多低级语言中的for(i = 2; i < len(xs); i++) 循环。
与另一个答案中提出的列表理解解决方案相比,for 循环略快:
from timeit import timeit
def in_place(xs):
for idx in range(2, len(xs), 3):
if xs[idx] % 2 == 1:
xs[idx] -= 1
return xs
def list_comp(xs):
xs[2::3] = [i - 1 if (i % 3 == 0 and i % 2 != 0) else i for i in xs[2::3]]
return xs
# This answer is an improvement, as it eliminates one modulus
def list_comp2(xs):
xs[2::3] = [x - 1 if x % 2 else x for x in xs[2::3]]
return xs
context = {"globals": globals(), "setup": "xs = [1, 2, 3, 4, 5, 6, 7, 8, 9]"}
print(f"For loop: {timeit('in_place(xs)', **context)}")
print(f"List comprehension: {timeit('list_comp(xs)', **context)}")
print(f"List comprehension 2: {timeit('list_comp2(xs)', **context)}")
在我的机器上,这会产生:
For loop: 0.608657514
List comprehension: 0.7510721879999999
List comprehension 2: 0.641639047