目录
排列组合公式
有顺序的从n个不同元素取出m个
无顺序的从n个不同元素取出m个
对n个各不相同的元素进行全排列
一共有n!种情况
例如(1,2,3)有3!=6种,分别是123、132、231、213、312、321
对n个元素进行全排列,其中有重复元素
假设该元素重复m次,则一共有n! / m! 种情况
例如(1,1,1,2,3)有5个元素,所以分母是5!,有一个重复元素,且重复3次,所以分子是3!
所以有5! / 3! = 20种情况
有多个重复元素例如(1,1,2,2,3),有5个元素,所以分母是5!,有两个重复元素,分别重复2次,所以分母是2!*2!
所以有5! / (2!*2!) = 30种情况
再例如(1,1,2,2,2,3)有6个元素,所以分母是6!,有两个重复元素,分别重复2次和3次,所以分母是2!*3!
所以有6! / (2!*3!) = 60种情况
代码实现排列
使用itertools模块中的permutation()函数,permutation()函数接收一个可迭代对象如列表,然后会返回所有的可能排列情况
import itertools # 导入模块
for i in itertools.permutations([1, 2, 3]):
print(i)
结果
permutation()函数不会检测重复的元素
import itertools # 导入模块
for i in itertools.permutations([1, 1, 2]):
print(i)
结果
可以看到有很多重复的排列,因为permutation()函数认为两个1是不同的
可以使用集合进行去重
import itertools
r = set() # 创建集合
for i in itertools.permutations([1, 1, 1, 2, 3]):
r.add(i) # add将i添加到集合,重复的元素不会添加
print(r)
print(len(r)) # 排列的个数
结果为20,跟上面使用的公式计算结果相同