Python生成所有唯一的排列,没有排序的重复[修正,我的意思是寻找组合]



编辑:我混淆了排列和组合之间的区别。编辑问题只是为了保持它(因为我不能删除它)。虽然我意识到了我的错误。

我一直在浏览这个问题,我找不到一个唯一适合我正在寻找的解决方案。

基本概念是如果我运行一个函数gen_permutations([1,2])来生成排列。我将得到结果([1,2],[2,1]),尽管在这个结果中,我将它们分类为相同的集合。

我会考虑检查result[0] < result[1]的东西,然后将其添加到结果集。但是,如何将其按比例放大,例如gen_permutations(input, size=n | n <= len(input))呢?

抱歉,如果有一个问题回答这个问题,但所有"类似的问题"都指向我只是"唯一的结果",其中[1,2]!=[2,1]。

编辑:为了混淆,函数gen_permutations只是一个通用的生成器,我发现并在这里使用如何在Python中生成列表的所有排列

另一个让它变大的例子。我可以运行这个例子

for i in permutations([1,2,3,4],3):
    print i

获取结果(1, 2, 3), (1, 2, 4),(1, 3, 2),(1, 3, 4),(1, 4, 2),(1, 4, 3),(2, 1, 3),(2, 1, 4),(2, 3, 1),(2, 3, 4),(2, 4, 1),(2, 4, 3),(3, 1, 2),(3, 1, 4),(3, 2, 1),(3, 2, 4),(3, 4, 1),(3, 4, 2),(4, 1, 2),(4, 1, 3),(4, 2, 1),(4, 2, 3),(4, 3, 1),(4, 3, 2)

虽然(1,2,3)(3,2,1)我认为不是唯一的。因为如果你重新订购它们,它们将是同一套。我需要帮助编码一个不会生成结果(3,2,1)的排列生成器,因为(1,2,3)已经生成。

你在寻找组合吗?在数学中,组合不关心顺序,所以[1,2]等于[2,1]。

在python中,您可以简单地执行:

import itertools
list(itertools.combinations([1,2], 2))

输出:

[(1,2)]

排列顺序很重要,所以[1,2][2,1]是不同的。

似乎你想要的是组合, python已经为此提供了内置支持。

import itertools
print list(itertools.combinations('ABCD', 2))

结果是:

[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]

还可以遍历结果,因为itertools.combination()返回一个迭代器。

import itertools
for i in itertools.combinations('ABCD', 2):
    print i
结果:

('A', 'B')
('A', 'C')
('A', 'D')
('B', 'C')
('B', 'D')
('C', 'D')

相关内容

最新更新