如何在列表中循环多次超过列表大小?

5

在Python中是否有一个函数或本地库,允许我在列表中循环的次数超过列表元素的数量?换句话说,当我的感兴趣的索引大于列表大小时,下一个元素是列表的第一个元素。

例如,我有这个列表:

abc = ['a', 'b', 'c', 'd', 'e']

所以,如果我有一个值为10的索引,结果将是'a'。如果索引的值为18,结果将是'd'


使用取模运算符。 - user3483203
你可以使用itertools模块中的函数cycle(seq)从你的abc数组创建无限序列,然后你可以使用同一模块中的islice(seq, count)函数在某个点上截断这个序列。 - Nikita Sivukhin
2个回答

13

最简单的方法:使用模运算将索引包装起来。

>>> abc = ['a', 'b', 'c', 'd', 'e' ]
>>> abc[18 % len(abc)]
'd'

如果您想的话,可以将其封装在助手类中:

>>> class ModList(list):
...     def __getitem__(self, item):
...         if isinstance(item, slice):
...             return super().__getitem__(item)
...         return super().__getitem__(item % len(self))
...     
>>> abc = ModList('abcde')
>>> abc[18]
'd'
>>> abc[-5]
'a'
>>> abc[-6]
'e'

你可能希望以类似的方式实现__setitem____delitem__


2
abc[18:20]怎么样? :P - khachik

1

itertools.cycle() 可以让你按顺序重复迭代一个列表。

from itertools import cycle


abc = ['a', 'b', 'c', 'd', 'e' ]

alfs = ''

for n, e in enumerate(cycle(abc)):  # lazy enumeration?
    alfs += e
    if n >= 18:  # must have stopping test to break infinite loop
        break
alfs
Out[30]: 'abcdeabcdeabcdeabcd'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接