Itertools は、この問題を処理するのに十分な能力がなく、ペグと穴の問題を少し理解する必要があります。
リストの例を検討してください
A = [1, 2] B = [3, 4]
len(A) + len(B)
要素 (ペグ) を配置できる4 つの穴 ( ) があります。
| || || || |
|___||___||___||___|
Python では、空のスロットを次のリストとして表すことができます。None
slots = [None]*(len(A) + len(B))
2 番目のリストの要素 (ペグ) をペグに配置できる方法の数は、単純に、穴からスロットを選択できる方法の数です。
len(A) + len(B)
ハlen(B)
= 4
C2
=itertools.combinations(range(0, len(len(A) + len(B)))
次のように表すことができます
| || || || | Slots
|___||___||___||___| Selected
3 4 (0,1)
3 4 (0,2)
3 4 (0,3)
3 4 (1,2)
3 4 (1,3)
3 4 (2,3)
これらのスロット位置のそれぞれについて、2 番目のリストの要素 (ペグ) を入力します。
for splice in combinations(range(0,len(slots)),len(B)):
it_B = iter(B)
for s in splice:
slots[s] = next(it_B)
完了したら、最初のリストの要素 (ペグ) で残りの空のスロットを埋める必要があります。
it_A = iter(A)
slots = [e if e else next(it_A) for e in slots]
別のスロット位置で次の反復を開始する前に、穴をフラッシュします
slots = [None]*(len(slots))
上記のアプローチの Python 実装
def slot_combinations(A,B):
slots = [None]*(len(A) + len(B))
for splice in combinations(range(0,len(slots)),len(B)):
it_B = iter(B)
for s in splice:
slots[s] = next(it_B)
it_A = iter(A)
slots = [e if e else next(it_A) for e in slots]
yield slots
slots = [None]*(len(slots))
そして、上記の実装からの O/P
list(slot_combinations(A,B))
[[3, 4, 1, 2], [3, 1, 4, 2], [3, 1, 2, 4], [1, 3, 4, 2], [1, 3, 2, 4], [1, 2, 3, 4]]