以循环方式生成列表的子集
Generate a subset of list in a cyclical manner
x = [1,2,3,4,5,6,7]
。
y = 3
。假设 y<=len(x)
如何从长度为 y
的 x
生成子集,例如
[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
x = [1,2,3,4,5,6,7]
。
y = 3
。假设 y<=len(x)
如何从长度为 y
的 x
生成子集,例如
[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