以循环方式生成列表的子集

Generate a subset of list in a cyclical manner

x = [1,2,3,4,5,6,7]y = 3。假设 y<=len(x)

如何从长度为 yx 生成子集,例如

[1,2,3], [4,5,6], [7,1,2], [3,4,5], [6,7,1] ....

假设第一个子集是 x[:3],我如何继续生成其余子集?

编辑 1:我的解决方案基于@Jordan 的回答

xs = [1,2,3,4,5,6,7]
y = 3

sublist = None

def cycles(xs, y, prev):
    start = 0 if prev[-1]==xs[-1] else (xs.index(prev[-1])+1)
    sublist = [xs[i % len(xs)] for i in range(start, start + y)]
    start = (start + y) % len(xs)
    return sublist

for _ in range(10):

    if sublist == None:
        prev = xs[0:y]
        prev = cycles(xs, y, prev)
        print("first")
        sublist = prev
    else:
        prev = cycles(xs, y, prev)


    print(prev)

您可以使用生成器继续生成它们。一种可能的解决方案(也适用于 y > len(x)):

def cycles(xs, y):
    start = 0
    while True:
        sublist = [xs[i % len(xs)] for i in range(start, start + y)]
        start = (start + y) % len(xs)
        yield sublist