动漫人物
当您有一个由N个元素组成的列表时,该列表的一个循环排列由其第一个元素唯一地给出。Than表示您将具有正好N个循环排列(包括原始列表),并且可以通过删除fist元素并将其添加到列表的末尾从一个传递到另一个。您可以轻松地为列表的所有循环排列构建一个生成器: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演示:>>> list(circ_perm([1,2,3,4]))[[1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3]]如果您想要的是唯一的排列(当两个排列是另一个排列的排列)时,您仍然可以使用以下事实:循环排列由其第一个元素给出,并固定第一个元素,并找到剩下的所有排列:def uniq_perm(lst): gen = itertools.permutations(lst[1:]) for end in gen: yield [lst[0]] + list(end)演示:>>> 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]]
犯罪嫌疑人X
进行排列的复杂度约为O(n * n!),因此对于大数或列表而言,生成所有可能的排列效率低下,您可以使用回溯来生成列表排列,我将分享一个链接,可能会有所帮助。 该解决方案基于回溯 def permute(a, l, r): if l == r: print(a) else: for i in range(l, r + 1): a[l], a[i] = a[i], a[l] permute(a, l + 1, r) a[l], a[i] = a[i], a[l]data = [1,2,3,4,5]n = len(data)a = list(data)permute(a, 0, n - 1)