如果索引范围超出范围,请重复列表

时间:2016-09-07 16:28:44

标签: python

我有一个Python列表

a = [1, 2, 3, 4]

我希望得到一系列索引,如果我选择索引0N,我就会得到(N=10)重复

[1, 2, 3, 4, 1, 2, 3, 4, 1, 2]

我当然可以先通过(int(float(N) / len(a) - 0.5) + 1) * a重复列表,然后选择范围[0:10],但这感觉相当笨拙。

任何提示?

6 个答案:

答案 0 :(得分:6)

访问列表时可以简单地使用模运算符,即

a[i % len(a)]

这将为您提供相同的结果,但不需要实际存储冗余元素。

答案 1 :(得分:4)

您可以使用itertools.cycleitertools.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),但这是一般的想法。