作为对此的扩展,我正在寻找一种方法来索引一个循环对象中的元素。
为此,您可以编写一个自定义类,并使用 `__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]
你可能还想实现其他列表方法并根据需要进行优化。但这里讨论的是循环对象索引的主要思路。