我有一个Python列表
a = [1, 2, 3, 4]
我希望得到一系列索引,如果我选择索引0
到N
,我就会得到(N=10
)重复
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2]
我当然可以先通过(int(float(N) / len(a) - 0.5) + 1) * a
重复列表,然后选择范围[0:10]
,但这感觉相当笨拙。
任何提示?
答案 0 :(得分:6)
访问列表时可以简单地使用模运算符,即
a[i % len(a)]
这将为您提供相同的结果,但不需要实际存储冗余元素。
答案 1 :(得分:4)
您可以使用itertools.cycle
和itertools.islice
:
from itertools import cycle, islice
my_list = list(islice(cycle(my_list), 10))
请注意,如果您只想迭代一次,则应避免调用list
并迭代迭代,因为这样可以避免重复分配元素。
答案 2 :(得分:1)
一种简单的方法是使用modulo和listcomprehensionsàla
a = [1, 2, 3 ,4]
[k % len(a) for k in range(10)]
答案 3 :(得分:0)
>>> a = [1, 2, 3, 4]
>>> (a*3)[:-2]
>>> [1, 2, 3, 4, 1, 2, 3, 4, 1, 2]
答案 4 :(得分:0)
以为我会使用${row.object}
运算符为列表提供解决方案。
*
示例输出:
import math
def repeat_iterable(a, N):
factor = N / len(a) + 1
repeated_list = a * factor
return repeated_list[:N]
答案 5 :(得分:0)
伪造怎么样? Python擅长伪造。
class InfiniteList(object):
def __init__(self, data):
self.data = data
def __getitem__(self, i):
return self.data[i % len(self.data)]
x = InfiniteList([10, 20, 30])
x[0] # 10
x[34] # 20
当然,您可以添加__iter__
,支持切片等。您还可以添加限制(N),但这是一般的想法。