擅长:python、mysql、java
<p>当你有一个N个元素的列表时,列表的一个循环排列是由它的第一个元素唯一给出的。Than意味着您将有N个循环排列(包括原始列表),并且您可以通过移除第一个元素并将其添加到列表末尾来从一个元素传递到另一个元素。在</p>
<p>您可以轻松地为列表的所有循环排列生成生成器:</p>
<pre><code>def circ_perm(lst):
cpy = lst[:] # take a copy because a list is a mutable object
yield cpy
for i in range(len(lst) - 1):
cpy = cpy[1:] + [cpy[0]]
yield cpy
</code></pre>
<p>演示:</p>
^{pr2}$
<hr/>
<p>如果你想要的是唯一的排列,当两个排列是另一个的圆形排列时,你仍然可以使用这样一个事实:一个圆形排列是由它的第一个元素给出的,然后固定第一个元素,然后找到剩下的所有排列:</p>
<pre><code>def uniq_perm(lst):
gen = itertools.permutations(lst[1:])
for end in gen:
yield [lst[0]] + list(end)
</code></pre>
<p>演示:</p>
<pre><code>>>> list(uniq_perm([1,2,3,4]))
[[1, 2, 3, 4], [1, 2, 4, 3], [1, 3, 2, 4], [1, 3, 4, 2], [1, 4, 2, 3], [1, 4, 3, 2]]
</code></pre>