在Python中获取所有可能的排序组合。

4
我有一个由1和2组成的列表,例如[2, 1, 1, 1]。我需要获取所有可能的组合:
[[2, 1, 1, 1], 
[1, 2, 1, 1], 
[1, 1, 2, 1],
[1, 1, 1, 2]]

我尝试使用itertools的product函数,但是它返回相同的结果(例如 [2, 1, 1, 1])多次,并且当输入更大时效率会变低。是否有类似这样的内置函数可用?


我理解它会在不同的位置返回1,有没有办法避免这种情况? - areedy
1
这回答解决了你的问题吗?如何获取列表元素的所有可能组合? - Dennis Kozevnikoff
3
你需要的是“独特的排列”(unique permutations),而不是组合或笛卡尔积。 - tobias_k
1
multiset_permutations 函数提供了不重复排列的多重集合排列。 - Chris Charley
1个回答

7
你需要的是排列组合:
>>> import itertools
>>> a = [2, 1, 1, 1]
>>> list(set(itertools.permutations(a)))
[(1, 1, 1, 2), (1, 1, 2, 1), (2, 1, 1, 1), (1, 2, 1, 1)]

1
list(set(itertools.permutations(a))) 这段代码也可以运行。 - Sabil
@Sabil 确认,已更新。 - MohitC
这是一种非常低效的方法。请查看 sympy 中的 multiset_permutations 函数。 - Joseph Wood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接