Python:根据条件生成所有排列

时间:2018-02-05 23:26:39

标签: python permutation

我尝试生成列表的所有排列,但受限于旋转没有重复的约束。因此,如果我为长度为3的列表执行此操作,执行正常排列,我将同时获得[1, 2, 3][2, 3, 1]。但是,[2, 3, 1]只是[1, 2, 3]的轮播,所以我不想包含它。

我可以生成所有排列,循环并删除违反此约束的元素,但这似乎很浪费。

我如何考虑排列,而不是考虑所有排列然后删除重复排列?

谢谢!

1 个答案:

答案 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)