Python:到达末尾时,循环遍历列表中的元素
我有一个如下列表:Python:到达末尾时,循环遍历列表中的元素,python,list,cycle,Python,List,Cycle,我有一个如下列表: a = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10'] 我需要在这个列表中一次循环一个元素,但是当到达列表的末尾时,循环需要反转 例如,使用: 我得到: 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10 但我需要的
a = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10']
我需要在这个列表中一次循环一个元素,但是当到达列表的末尾时,循环需要反转
例如,使用:
我得到:
01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10
但我需要的是:
01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 10, 09, 08, 07, 06, 05, 04, 03, 02, 01, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10
我需要在a
中循环一个固定的次数,比如说200次。你真的需要在列表中循环,就像永远向前和向后一样吗?还是仅仅是名单
print a + a[::-1]
我会照你说的做。内置函数也可以工作,但您需要chain()
它,因为它返回一个迭代器,例如:
print list(itertools.chain(a, reversed(a)))
您可以对任意一个结果调用itertools.cycle()
,以获得列表的无限迭代器,并将其反向连接起来
def forwardback(lst):
tot = len(lst)
while 1:
for i in xrange(tot):
yield lst[i]
for i in xrange(tot-1,-1,-1):
yield lst[i]
或者(使用cycle
的方法,该方法适用于所有迭代器)
您可以选择您的a
和a
,例如:
from itertools import cycle, islice, chain
a = range(1, 11)
b = reversed(a)
c = cycle(chain(a, b))
d = list(islice(c, 100)) # `c` is infinite - hence the `islice` to stop at some point...
这给了你:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
注意:如果
a
是一个可耗尽的迭代器,则需要先复制a
。但举个例子,这样就可以了。复制列表a,将其反转,然后追加
a = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10']
b = a[:]
b.reverse()
a = a + b
或者基于评论建议
a = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10']
b = a[::-1]
a = a + b
你需要这个是不确定的吗?@ScironicI需要它运行,直到外部
for
循环(未显示在问题中)耗尽其元素。Dimo414的解决方案应该可以工作,你可以循环使用。对不起,是我。我草率地误读了你的代码。看到范围(30)中的i和前导零,认为您是许多没有显示实际数据的人之一。我取消了投票。如果您为范围(30)
中的uuu编写了,那么就不会发生这种情况,顺便说一句,因为这是您不打算使用的值的约定。但这真的是我的错,我应该休息一下。不用担心,在意识到否决票已经消失后,我删除了关于否决票的问题。我将更改的我
,谢谢你的建议.reverse()
不返回任何内容,因此不起作用。使用a+a[:-1]
instead@Scironic如果是正确的,a.reverse()
返回None
。由于列表是可变的,因此您的编辑仍然不起作用,因此将其分配给新变量并将其反转会反转两个列表。您需要复制才能执行此操作,但使用反向切片更容易参见dimo414s答案,您可以使用反向切片:a[:-1]
注意:i
在第二个代码块中进行生成lst[i]
时尚未定义。当您可以直接迭代iterables时,为什么要使用索引呢?您可以使用reversed()
对任何iterable进行反向迭代,并在列表等对象上使用扩展切片表示法,例如对v进行反向(已保存):
或对v进行已保存[:-1]:
。谢谢。修正了打字错误。复制了以前的程序并对其进行了编辑。另外,您关于反转的看法是正确的。我不知道它返回了一个迭代器。我不想用更多的空间重新创建列表。
a = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10']
b = a[:]
b.reverse()
a = a + b
a = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10']
b = a[::-1]
a = a + b