索引到一个圆形数组

时间:2015-12-26 22:03:12

标签: python arrays

我有一个圆形阵列。我用以下内容创建了它:

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'

有这样的方法吗?

4 个答案:

答案 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
>>>