我正在尝试处理向量
说,我有这个向量
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)]
执行此操作?
答案 0 :(得分:1)
尽管计算索引是可能的,但我将itertools.cycle
与zip(*[] * 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])
注意:我不建议这样做,建议上面的其他方法。