循环列表 n 次

2 python for-loop

说你有这个:

foo = [1,2,3,4,5,6,7,8,9,10]
bar = 22
Run Code Online (Sandbox Code Playgroud)

我想按时间顺序打印一个数字,bar时间。所以,它应该使: 1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2

要做到这一点,你可以这样做

foo = [1,2,3,4,5,6,7,8,9,10]
bar = 22

x = 0

for i in range(bar):
    print(foo[x])

    # increment
    if x == 9:
        x = 0
    # back to 1
    else:
        x += 1
Run Code Online (Sandbox Code Playgroud)

但是有没有更短的方法,不使用临时变量,x

0x5*_*453 5

虽然 Kemp 的解决方案确实有效,但我相信更 Pythonic 的解决方案是使用该itertools包:

import itertools
foo = [1,2,3,4,5,6,7,8,9,10]
bar = 22
for i in itertools.islice(itertools.cycle(foo), bar):
    print(i)
Run Code Online (Sandbox Code Playgroud)

cycle在指定的可迭代对象上创建一个无限重复的迭代器。在我们消费 之后10,迭代器将回到1

islice像典型的列表切片语法一样工作,但除了容器之外,它还适用于迭代器和生成器。我们可以使用它bar从迭代器中获取项目。

这更灵活一点,因为它不需要foo可下标。换句话说,即使在以下情况下这也会起作用:

  • foo是一个迭代器(例如foo = iter(foo)
  • foo是一个生成器(例如foo = (x*2 for x in foo)
  • foo是一个特殊的代理对象,如dict_keysdict_values(例如foo = {x: str(x) for x in foo}.keys()