Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中多次反转迭代器_Python_Iterator - Fatal编程技术网

在Python中多次反转迭代器

在Python中多次反转迭代器,python,iterator,Python,Iterator,我尝试使用reversed函数多次反转同一迭代器。例如,使用代码: iterator = range(3) N = 5 k = 0 out = [] while k < N: for i in iterator: out.append(i) iterator = reversed(iterator) k += 1 print(out) 但是,在第一次使用reverse之后,我得到了一个错误: TypeError: 'range_iterator'

我尝试使用
reversed
函数多次反转同一迭代器。例如,使用代码:

iterator = range(3)
N = 5
k = 0
out = []
while k < N:
    for i in iterator:
        out.append(i)
    iterator = reversed(iterator)
    k += 1
print(out)
但是,在第一次使用reverse之后,我得到了一个错误:

TypeError: 'range_iterator' object is not reversible

什么是不需要解包迭代器的有效解决方法?

您只需交替使用原始迭代器和反向迭代器即可。 您可以从以下简单示例开始:

iterator = range(3)
N = 5
k = 0
out = []
while k < N:
    if k%2 == 0:
        it = iterator
    else:
        it = reversed(iterator)
    for i in it:
        out.append(i)
    k += 1
print(out)

[0, 1, 2, 2, 1, 0, 0, 1, 2, 2, 1, 0, 0, 1, 2]
iterator=range(3)
N=5
k=0
out=[]
当k
谢谢您的回复。我事先就知道,我可以只使用一个包含原始版本和反转版本的列表,只选择我需要的版本,但我真的很想看看是否存在一些对我来说很自然的东西,例如
反转(反转(无论什么))
。因此,让它更紧凑一点,并添加一个布尔值
do_reverse
(我在实际项目中需要它),我将使用以下内容:

iterator = range(3)
do_reverse = True
N = 5
k = 0
out = []
while k < N:
    for i in [iterator, reversed(iterator)][k % 2 * do_reverse]:
        out.append(i)
    k += 1
print(out)
iterator=range(3)
do_reverse=True
N=5
k=0
out=[]
当k
根据定义,迭代器在未解压缩的情况下无法反转。迭代器可以是一个生成器,它只在每一步生成下一个值,根据定义,这是不可逆的。我同意生成器的说法,但在这个特殊情况下,对于范围迭代器,只需查看其start、stop和step属性,就足以在不解包的情况下构建其反向版本,不是吗?即使需要解包,我可以接受。问题是,它允许我反转它一次,但是它不允许我反转已经反转的迭代器,基本上是回到原始的范围迭代器。范围对象是一个特殊的对象,它支持各种特殊的迭代方法。一旦你把它变成一个真正的迭代器,它就消失了。由于您一般询问迭代器,因此值得指出的是,这根本不能推广到迭代器;它允许您创建一个直接从iterable反向迭代的迭代器。
if
可以是:
it=iterator if k%2==0 else reversed(iterator)
甚至:
it=[iterator,reversed(iterator)][k%2]
iterator = range(3)
do_reverse = True
N = 5
k = 0
out = []
while k < N:
    for i in [iterator, reversed(iterator)][k % 2 * do_reverse]:
        out.append(i)
    k += 1
print(out)