假设你有这个:
foo = [1,2,3,4,5,6,7,8,9,10]
bar = 22
我想从 foo
中获取 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
但是有没有更短的方法,它不使用临时变量 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)
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在 foo}.keys()
)