<p>Itertools不足以处理这个问题,需要对peg和holes问题有一些了解</p>
<p>考虑您的示例列表</p>
<p>A=[1,2]
B=[3,4]</p>
<p>有四个孔(<code>len(A) + len(B)</code>)可以放置元素(木桩)</p>
<pre><code>| || || || |
|___||___||___||___|
</code></pre>
<p>在Python中,可以将空槽表示为<code>None</code>的列表</p>
^{pr2}$
<p>您可以将第二个列表中的元素(peg)放置到pegs中的方法非常简单,您可以从孔中选择插槽的方法是</p>
<p><sup><code>len(A) + len(B)</code></sup>C<sub><code>len(B)</code></sub></p>
<p>=<sup><code>4</code></sup>C<sub><code>2</code></sub></p>
<p>=<code>itertools.combinations(range(0, len(len(A) + len(B)))</code></p>
<p>可以描述为</p>
^{3}$
<p>现在,对于每个插槽位置,用第二个列表中的元素(peg)填充它</p>
<pre><code>for splice in combinations(range(0,len(slots)),len(B)):
it_B = iter(B)
for s in splice:
slots[s] = next(it_B)
</code></pre>
<p>完成后,您只需使用第一个列表中的元素(peg)填充剩余的空插槽</p>
<pre><code> it_A = iter(A)
slots = [e if e else next(it_A) for e in slots]
</code></pre>
<p>在使用另一个插槽位置开始下一次迭代之前,请冲洗孔</p>
<pre><code> slots = [None]*(len(slots))
</code></pre>
<p>上述方法的Python实现</p>
<pre><code>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))
</code></pre>
<p>以及上述实现的O/p</p>
<pre><code>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]]
</code></pre>