我尝试生成列表的所有排列,但受限于旋转没有重复的约束。因此,如果我为长度为3的列表执行此操作,执行正常排列,我将同时获得[1, 2, 3]
和[2, 3, 1]
。但是,[2, 3, 1]
只是[1, 2, 3]
的轮播,所以我不想包含它。
我可以生成所有排列,循环并删除违反此约束的元素,但这似乎很浪费。
我如何考虑排列,而不是考虑所有排列然后删除重复排列?
谢谢!
答案 0 :(得分:2)
取下第一个元素,生成其他元素的排列,并将第一个元素粘贴到每个排列的前面。这将生成每个旋转等价类的一个代表,特别是原始第一个元素仍然是第一个的代表。
import itertools
def permutations(iterable):
# Special case: empty iterable
iterable = list(iterable)
if not iterable:
yield ()
return
first, *rest = iterable
for subperm in itertools.permutations(rest):
yield (first, *subperm)