【问题标题】:Is it a way to know index using itertools.cycle()?它是一种使用 itertools.cycle() 了解索引的方法吗?
【发布时间】:2014-12-19 07:11:39
【问题描述】:

我需要遍历一个列表并在到达最后一项时返回第一个元素。

来自itertoolscycle 对象就是为此而设计的。

myList = [1,2,3,4,5,6,7,8,9]

i = 0
for item in cycle(myList):
    index = i%9
    print (index)
    i += 1

除了使用i 变量还有其他方法吗?

【问题讨论】:

  • 您的索引似乎没有保持同步;您有一个 9 元素循环,但正在重置 mod 10。

标签: python indexing cycle itertools


【解决方案1】:

你可以使用enumerate:

for i, item in enumerate(cycle(myList)):

下面是一个演示:

>>> from itertools import cycle
>>> for i, item in enumerate(cycle([1, 2, 3])):
...     print i, item
...
0 1
1 2
2 3
3 1
4 2
5 3

你甚至可以给出一个具体的数字开始:

for i, item in enumerate(cycle([1, 2, 3]), 10): # Start at 10

阅读@DSM 的评论,我意识到您可能希望将电话转至cycleenumerate

>>> for i, item in cycle(enumerate([1, 2, 3])):
...     print i, item
...
0 1
1 2
2 3
0 1
1 2
2 3

这将导致i 引用列表中item 的索引,而不是充当计数器变量。

【讨论】:

  • 因为% 10我想知道OP是否真的在寻找更像cycle(enumerate([1,2,3]))的东西(有或没有1的开始),所以列表的相同值总是对应于同一个索引。不过很难确定。
【解决方案2】:

作为对此的扩展,我一直在寻找一种方法来索引cycle 对象中。

为此,您可以编写一个带有__getitem__ 方法的自定义类来替代cycle

from itertools import cycle, takewhile, dropwhile


class CyclicalList:
    def __init__(self, initial_list):
        self._initial_list = initial_list

    def __getitem__(self, item):
        if isinstance(item, slice):
            if item.stop is None:
                raise ValueError("Cannot slice without stop")
            iterable = enumerate(cycle(self._initial_list))
            if item.start:
                iterable = dropwhile(lambda x: x[0] < item.start, iterable)
            return [
                element
                for _, element in takewhile(lambda x: x[0] < item.stop, iterable)
            ]

        for index, element in enumerate(cycle(self._initial_list)):
            if index == item:
                return element

    def __iter__(self):
        return cycle(self._initial_list)

这允许您使用常规索引/切片表示法。

myList = CyclicalList([1,2,3,4,5,6,7,8,9])
myList[10]  # 2
myList[10:20]  # [2, 3, 4, 5, 6, 7, 8, 9, 1, 2]

您可能还想实现其他列表方法并进行优化,具体取决于您的需要。但这解决了对循环对象进行索引的主要思想。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2019-04-25
    • 2013-04-24
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多