说你有这个:
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?
虽然 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_keys或dict_values(例如foo = {x: str(x) for x in foo}.keys())