<p>在2x4的情况下,您希望在不中断每个四边形内的顺序的情况下获取所有8个元素。这些例子:</p>
<pre><code>a, b, c, d, 1, 2, 3, 4
1, 2, 3, 4, a, b, c, d
a, b, 1, 2, c, 3, 4, d
</code></pre>
<p>可以转换为“指令”序列,这些指令是从0或1中获取的列表:</p>
^{2}$
<p>一旦您意识到这一点,您可能会注意到我们需要生成的序列都是由4个0和4个1组成的排列。完成这一飞跃后,我们可以使用<code>itertools</code>:</p>
<pre><code>itertools.permutations([0,0,0,0,1,1,1,1])
</code></pre>
<p>对于2x4的情况,这给出了40320个结果,但只有70个唯一的结果(因为<code>itertools.permutations</code>认为1,1,1与1,1,1不同,如果数字被重新排序)。你可以从这里的答案中得到唯一的排列:<a href="https://stackoverflow.com/a/6285330/4323">https://stackoverflow.com/a/6285330/4323</a>或者只使用<code>set()</code>。在</p>
<hr/>
<p>综上所述,这里有一个完整的解决方案:</p>
<pre><code>import itertools
def combos(*seqs):
counts = map(len, seqs)
base = []
for ii, count in enumerate(counts):
base.extend([ii]*count)
for take in set(itertools.permutations(base)):
result = []
where = [0] * len(seqs)
for elem in take:
result.append(seqs[elem][where[elem]])
where[elem] += 1
yield result
</code></pre>
<p>你可以这样测试(给出70个结果):</p>
<pre><code>a = ['a', 'b', 'c', 'd']
b = [1, 2, 3, 4]
for res in combos(a, b):
print res
</code></pre>