<分区>
如何检查列表中的每三个元素?
即。鉴于下面的列表,我想改变每三个项目并保持列表的其余部分不变。
L = [1,2,3,4,5,6,7,8,9]
基本上,如果列表中的第三个元素(在本例中为 3,6,9
)为奇数,则减一使其为偶数。如果是偶数,就让它保持不变。
我知道如果我执行 L[2::3]
我会得到一个包含每三个元素的新列表,但我只是想遍历每三个元素并检查。
for 循环会是什么样子?我需要一些帮助。
感谢并感谢所有帮助!
<分区>
如何检查列表中的每三个元素?
即。鉴于下面的列表,我想改变每三个项目并保持列表的其余部分不变。
L = [1,2,3,4,5,6,7,8,9]
基本上,如果列表中的第三个元素(在本例中为 3,6,9
)为奇数,则减一使其为偶数。如果是偶数,就让它保持不变。
我知道如果我执行 L[2::3]
我会得到一个包含每三个元素的新列表,但我只是想遍历每三个元素并检查。
for 循环会是什么样子?我需要一些帮助。
感谢并感谢所有帮助!
最佳答案
不要想太多。在这种情况下,列表推导式、函数等都是矫枉过正的。您需要遍历列表并就地修改它,对吗?所以你没有修改你正在迭代的结构。迭代目标实际上是列表的索引。
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
关于python - 如何改变列表中的每三个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59113811/