擅长:python、mysql、java
<p>一种选择是使用一个计数器,其中set bits对应于<code>a</code>上的item,而unset则对应于<code>b</code>上的item。对于计数器中的每个值,检查是否设置了<code>len(a)</code>位并生成一个排列:</p>
<pre><code>def ordered_permutations(l1, l2):
length = len(l1) + len(l2)
fmt = '{{0:0{0}b}}'.format(length)
for i in xrange(2 ** length):
seq = fmt.format(i)
if seq.count('1') == len(l1):
iters = [iter(l1), iter(l2)]
yield [iters[int(c)].next() for c in seq]
</code></pre>
<p>用法:</p>
^{2}$
<p>输出:</p>
<pre><code>['a', 'b', 1, 2]
['a', 1, 'b', 2]
['a', 1, 2, 'b']
[1, 'a', 'b', 2]
[1, 'a', 2, 'b']
[1, 2, 'a', 'b']
</code></pre>
<p>可以通过使用<a href="http://code.stephenmorley.org/articles/hakmem-item-175/" rel="nofollow">HAKMEM 175</a>来生成下一个序列,而不是使用计数器和检查是否设置了正确的位,从而改进了实现。在</p>