您可以使用递归生成器函数:
import copy
set1, n = ('w1','w2','w3','w4'), 3
set2 = ('r1','r2','r3','r4','r5','r6','r7')
def combos(d, c = []):
if not d:
yield c
else:
for i, a in enumerate(d):
if (c1:=len(c)) + 1 <= (l1:=len(set1)):
yield from combos(d[:i]+d[i+1:], c+[[a]])
if ((_d:=d[:i]+d[i+1:]) or c1 == l1) and c and len(c[-1]) + 1 <= n:
yield from combos(_d, [*c[:-1], c[-1]+[a]])
r = combos(set2)
print([dict(zip(set1, map(tuple, next(r)))) for _ in range(100)])
输出(前 100 个结果):
[{'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4'), 'w4': ('r5', 'r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4'), 'w4': ('r5', 'r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4', 'r5'), 'w4': ('r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4', 'r5'), 'w4': ('r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4'), 'w4': ('r6', 'r5', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4'), 'w4': ('r6', 'r7', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4', 'r6'), 'w4': ('r5', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4', 'r6'), 'w4': ('r7', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4'), 'w4': ('r7', 'r5', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4'), 'w4': ('r7', 'r6', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4', 'r7'), 'w4': ('r5', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4', 'r7'), 'w4': ('r6', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5'), 'w4': ('r4', 'r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5'), 'w4': ('r4', 'r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5', 'r4'), 'w4': ('r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5', 'r4'), 'w4': ('r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5'), 'w4': ('r6', 'r4', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5'), 'w4': ('r6', 'r7', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5', 'r6'), 'w4': ('r4', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5', 'r6'), 'w4': ('r7', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5'), 'w4': ('r7', 'r4', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5'), 'w4': ('r7', 'r6', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5', 'r7'), 'w4': ('r4', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5', 'r7'), 'w4': ('r6', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6'), 'w4': ('r4', 'r5', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6'), 'w4': ('r4', 'r7', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6', 'r4'), 'w4': ('r5', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6', 'r4'), 'w4': ('r7', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6'), 'w4': ('r5', 'r4', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6'), 'w4': ('r5', 'r7', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6', 'r5'), 'w4': ('r4', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6', 'r5'), 'w4': ('r7', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6'), 'w4': ('r7', 'r4', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6'), 'w4': ('r7', 'r5', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6', 'r7'), 'w4': ('r4', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6', 'r7'), 'w4': ('r5', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7'), 'w4': ('r4', 'r5', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7'), 'w4': ('r4', 'r6', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7', 'r4'), 'w4': ('r5', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7', 'r4'), 'w4': ('r6', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7'), 'w4': ('r5', 'r4', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7'), 'w4': ('r5', 'r6', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7', 'r5'), 'w4': ('r4', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7', 'r5'), 'w4': ('r6', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7'), 'w4': ('r6', 'r4', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7'), 'w4': ('r6', 'r5', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7', 'r6'), 'w4': ('r4', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7', 'r6'), 'w4': ('r5', 'r4')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4',), 'w4': ('r5', 'r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4',), 'w4': ('r5', 'r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r5'), 'w4': ('r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r5', 'r6'), 'w4': ('r7',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r5'), 'w4': ('r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r5', 'r7'), 'w4': ('r6',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4',), 'w4': ('r6', 'r5', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4',), 'w4': ('r6', 'r7', 'r5')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r6'), 'w4': ('r5', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r6', 'r5'), 'w4': ('r7',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r6'), 'w4': ('r7', 'r5')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r6', 'r7'), 'w4': ('r5',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4',), 'w4': ('r7', 'r5', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4',), 'w4': ('r7', 'r6', 'r5')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r7'), 'w4': ('r5', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r7', 'r5'), 'w4': ('r6',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r7'), 'w4': ('r6', 'r5')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r7', 'r6'), 'w4': ('r5',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r5',), 'w4': ('r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r5', 'r6'), 'w4': ('r7',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r5',), 'w4': ('r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r5', 'r7'), 'w4': ('r6',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r6',), 'w4': ('r5', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r6', 'r5'), 'w4': ('r7',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r6',), 'w4': ('r7', 'r5')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r6', 'r7'), 'w4': ('r5',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r7',), 'w4': ('r5', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r7', 'r5'), 'w4': ('r6',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r7',), 'w4': ('r6', 'r5')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r7', 'r6'), 'w4': ('r5',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5',), 'w4': ('r4', 'r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5',), 'w4': ('r4', 'r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r4'), 'w4': ('r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r4', 'r6'), 'w4': ('r7',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r4'), 'w4': ('r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r4', 'r7'), 'w4': ('r6',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5',), 'w4': ('r6', 'r4', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5',), 'w4': ('r6', 'r7', 'r4')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r6'), 'w4': ('r4', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r6', 'r4'), 'w4': ('r7',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r6'), 'w4': ('r7', 'r4')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r6', 'r7'), 'w4': ('r4',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5',), 'w4': ('r7', 'r4', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5',), 'w4': ('r7', 'r6', 'r4')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r7'), 'w4': ('r4', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r7', 'r4'), 'w4': ('r6',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r7'), 'w4': ('r6', 'r4')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r7', 'r6'), 'w4': ('r4',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r5'), 'w3': ('r4',), 'w4': ('r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r5'), 'w3': ('r4', 'r6'), 'w4': ('r7',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r5'), 'w3': ('r4',), 'w4': ('r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r5'), 'w3': ('r4', 'r7'), 'w4': ('r6',)}]