Python中索引的循环范围

时间:2019-02-13 08:05:19

标签: python arrays list

我正在尝试处理向量

说,我有这个向量

v = [10, 20, 30, 40, 70, 80, 90]

我想每三个元素打印一次,如果到达末尾,它将返回到开始并把第一个移到元素,依此类推。例如,输出将类似于

10,20,30

40、70、80

90、10、20 <==重新开始

30,40,70

80、90、10 <==重新开始

以此类推...

我知道我可以创建一个函数,并使用模块来计算起始索引和结束索引,但是我在想是否有一种方法可以像玩游戏一样

v[8:10 % 9]  #would print v[8], v[0] and v[1]

我知道您可以为单个索引v [index%len(v)]执行此操作,但是是否可以对范围v[range % len(v)]执行此操作?

3 个答案:

答案 0 :(得分:1)

尽管计算索引是可能的,但我将itertools.cyclezip(*[] * x)石斑鱼一起使用:

from itertools import cycle

v = [10, 20, 30, 40, 70, 80, 90]

n = 10

for index, *group in zip(range(n), *[cycle(v)] * 3):
    print(group)

n更改为要循环的次数。输出:

[10, 20, 30]
[40, 70, 80]
[90, 10, 20]
[30, 40, 70]
[80, 90, 10]
[20, 30, 40]
[70, 80, 90]
[10, 20, 30]
[40, 70, 80]
[90, 10, 20]

答案 1 :(得分:1)

itertools有很多工具可以帮助您:

from itertools import cycle, islice


def chunks(iterable, size):
    it = iter(iterable)
    item = list(islice(it, size))
    while item:
        yield item
        item = list(islice(it, size))


v = [10, 20, 30, 40, 70, 80, 90]


for subset in chunks(cycle(v), 3):
  print(subset)

产生(产量)的

[10, 20, 30]
[40, 70, 80]
[90, 10, 20]
...

chunks函数取自here

答案 2 :(得分:0)

如果我正确理解您的问题,则需要循环索引。我认为有两种方法可以实现这一目标。通过您提到的显式函数,已经阐明了其他答案。但是,您希望通过常规列表语法(包括切片)来实现相同的目的。仅当您从基本列表类中创建一个子类时才有可能。下面是执行此操作的示例:

class circularlist(list):
    def map_key(self, key):
        length = len(self)
        return key%length

    def __getitem__(self, key):
        if isinstance(key, int):
            return super().__getitem__(self.map_key(key))
        elif isinstance(key, slice):
            step = key.step if key.step else 1
            idx = [i for i in \
                   range(key.start, key.stop, step)]
            return [self.__getitem__(i) for i in idx]
        else:
            print(type(key))
            return super().__getitem__(key)

v = [10, 20, 30, 40, 70, 80, 90]
vv = circularlist(v)

print(vv[42])
print(vv[20:30])

注意:我不建议这样做,建议上面的其他方法。

相关问题