gpt4 book ai didi

python - 如何一次循环n个项目而不是每次只步进1个? Python

转载 作者:行者123 更新时间:2023-12-01 05:12:02 25 4
gpt4 key购买 nike

我有一个发电机,比方说:

x = iter([1,2,3,4,5,6])

如果我想一次循环 3 个项目,但每次只执行 1 个项目,我想得到:

1 2 3
2 3 4
3 4 5
5 6

我尝试过一次循环两个,但每次都会执行 2 步:

x = iter([1,2,3,4,5,6])
x = list(x)
for i,j in zip(x[::2],x[1::2]):
print i,j

[输出]:

1 2
3 4
5 6

我尝试一次循环n次,但它也执行n次:

from itertools import izip_longest

def grouper(n, iterable, fillvalue=None):
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)

x = iter([1,2,3,4,5,6])

for i,j in grouper(3,x):
print i,j
print

[输出]:

Traceback (most recent call last):
File "test.py", line 11, in <module>
for i,j in grouper(3,x):
ValueError: too many values to unpack

我尝试在每次循环时只访问+n:

x = iter([1,2,3,4,5,6])
x = list(x)

for i,j in enumerate(x):
print x[i], x[i+1], x[i+2]

[输出]:

1 2 3
2 3 4
3 4 5
4 5 6
5 6
Traceback (most recent call last):
File "test.py", line 26, in <module>
print x[i], x[i+1], x[i+2]
IndexError: list index out of range

问题:

  • 在循环和一次访问多个值之前,我是否可以不将生成器更改为列表,但每次仅步进 1?

  • 除了使用我最后一个解决方案之外,如何实现所需的迭代?

最佳答案

您可以使用 teeisliceizip_longest 作为基础,并调整“停止”条件,例如:

from itertools import tee, islice, izip_longest

data = [1, 2, 3, 4, 5, 6]
iters = [islice(it, n, None) for n, it in enumerate(tee(data, 3))]
res = list(izip_longest(*iters))
# [(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, None), (6, None, None)]

示例停止条件可能是:

from itertools import takewhile
res = list(takewhile(lambda L: None not in L, izip_longest(*iters)))
# [(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)]

关于python - 如何一次循环n个项目而不是每次只步进1个? Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24011799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com