首页 > 解决方案 > 以循环方式生成列表的子集

问题描述

x = [1,2,3,4,5,6,7]. y = 3. 认为y<=len(x)

如何从x长度生成子集,y例如

[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)

标签: python-3.xlistrotation

解决方案


您可以使用生成器继续生成它们。一种可能的解决方案(也适用于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

推荐阅读