Как отмечено в комментариях, это, вероятно, слишком специфично, чтобы его можно было легко решить с помощью itertools, и вместо этого вы должны использовать рекурсивную (генераторную) функцию.Просто выберите следующий элемент из того списка, в котором он находится, отслеживая уже выбранные элементы, и рекурсивно вызывайте функцию снова, меняя местами списки и сокращая их и добавляя элемент в набор выбранных элементов, пока не получите требуемый элемент.число.
Примерно так (это можно улучшить, добавив параметры для текущего индекса в оба списка вместо того, чтобы фактически разрезать списки для рекурсивных вызовов):
def solve(n, lst1, lst2, selected):
if n == 0:
yield []
elif lst1:
for i, x in enumerate(lst1):
if x not in selected:
selected.add(x)
for rest in solve(n-1, lst2, lst1[i+1:], selected):
yield [x] + rest
selected.remove(x)
Или немногоболее сжатый:
def solve(n, lst1, lst2, selected):
if n == 0:
yield []
elif lst1:
yield from ([x] + rest for i, x in enumerate(lst1) if x not in selected
for rest in solve(n-1, lst2, lst1[i+1:], selected.union({x})))
Пример:
A = [1, 2, 3, 4]
B = [2, 5]
result = [res for n in range(1, len(A)+len(B)+1) for res in solve(n, A, B, set())]
Впоследствии result
это:
[[1], [2], [3], [4],
[1, 2], [1, 5], [2, 5], [3, 2], [3, 5], [4, 2], [4, 5],
[1, 2, 3], [1, 2, 4], [1, 5, 2], [1, 5, 3], [1, 5, 4], [2, 5, 3], [2, 5, 4], [3, 2, 4], [3, 5, 4],
[1, 2, 3, 5], [1, 2, 4, 5], [3, 2, 4, 5],
[1, 2, 3, 5, 4]]