作为对此的扩展,我一直在寻找一种方法来索引 到 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]
您可能还想实现其他列表方法并进行优化,具体取决于您的需要。但这解决了对循环对象进行索引的主要思想。