python - 如何改变列表中的每三个元素?

标签 python python-3.x list mutation

<分区>

如何检查列表中的每三个元素?

即。鉴于下面的列表,我想改变每三个项目并保持列表的其余部分不变。

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/

相关文章:

python - 如何删除引号并在 python 中检索列表?

c# - 使用前检查通用列表中的项目

python - learning_record_recorddinningroom.room_id 不能为 NULL

python - 使用 Python 正则表达式验证名称

Python 意外导入位置

python - 通过将旧函数包装在其上来创建具有较少参数的新函数

python - 为什么这个实例成员在 Python 中实例化后无法访问?

python - 'import nltk' 上的“ModuleNotFoundError : No module named nltk. 指标”

python - 如何在按 Enter 键时终止循环

python - 如何在不创建新列表对象的情况下获取 python 列表中的一系列行?