我有一个圆形阵列。我用以下内容创建了它:
from itertools import cycle
myArray = ['a','b','c','d']
pool = cycle(myArray)
现在我想在池中打印第n个项,其中n可能大于4.通常,这将是模数函数的简单使用,但逻辑上我认为Python有一个方法可以知道池中元素的数量(在此示例中为4
)并自动应用模数函数。
例如,1
st和5
项目为'a'
。所以我希望逻辑上相当于pool[0]
和pool[4]
给我'a'
。
有这样的方法吗?
答案 0 :(得分:4)
不,没有内置的方法来完成你想要做的事情。如前所述,您可以使用zip
,但这会涉及根据您的序列索引结果,以及生成所需项目的n
元素。
有时最简单的方法是最清晰的。使用modulo来完成你所追求的目标。
def fetch_circular(n):
myArray = ['a','b','c','d']
return myArray[n % 4]
答案 1 :(得分:4)
我认为你可能会将数组与生成器混淆。
在性能方面,数组的模数函数是可行的方法。
cycle是一个在请求时生成元素的函数。它不是具有方便方法的Cycle类。您可以在文档中看到等效的实现,并且您可能会理解它背后的想法:
https://docs.python.org/2/library/itertools.html#itertools.cycle
答案 2 :(得分:2)
列表肯定是要走的路,但是如果你真的有一个循环对象并希望第n个对象环绕,你可以islice
:
from itertools import cycle, islice
myArray = ['a','b','c','d']
pool = cycle(myArray)
print(next(islice(pool, 5)))
a
注意一旦你打电话给next(islice
你已经开始循环列表,如果你真的想要不断转动你可能真的想要一个deque
答案 3 :(得分:0)
您的pool
对象已经是一个生成器,它将永远循环遍历myArray
,所以您只需要用pool
这样的方式压缩迭代器:
>>> pool = cycle(myA)
>>> for i,item in zip(range(10),pool):
print i,item
0 a
1 b
2 c
3 d
4 a
5 b
6 c
7 d
8 a
9 b
>>>