在实际工作中,我们往往需要计算一些数据的排列和组合情况,比如一组参数中有多少种组合方式,而python已经为我们提供了一个内置模块itertools
。
一、itertools用法
itertool模块中提供了两个常用的函数,分别为combinations(iterable, k)和permutations(iterable, k)。
- combinations(iterable, k)即我们平常说的组合,就是不分顺序的,数学上表达为 C m k C^{k}_m Cmk,其中k就是参数中的k,m指的是可迭代的对象,可以为列表,元祖,字典
- permutations(iterable, k)即我们平常说的排列,排列就是区分顺序的,如12和21表示两个不同的排列,数学上表达式为 A m k A^{k}_m Amk,代表的是从m中数据中取出k中进行排列
二、代码实现
- 计算组合
import itertools
l=[1,2,3,4,5,6]
sum=itertools.combinations(l,2)
print(sum)
此时的sum是一个对象,打印结果为:
<itertools.combinations object at 0x00AF2E88>
可以看出这是一个可迭代的对象,可以将这个可迭代的对象转变成列表,只需要添加list方法即可
上图表示的是从6个数中选出2个数,共有多少中组合,但是打印出来的是一个列表,想知道是多少个还得计算列表的长度,当然python也提供了另一个模块直接计算排列组合的数量,即scipy模块
- 计算排列
import itertools
l=[1,2,3,4,5,6]
sum=itertools.permutations(l,2)
n=list(sum)
print(n)
上述代码表示的是将列表中选择2个组成一注数据,但排列是有顺序的,所以从结果可以看到(1,2)和(2,1)分别算作一注,计算结果如下图:
3.根据参数计算各种长度的序列
import itertools
def create_combination(para_list):
init_combination = []
for i in range(len(para_list)):
i += 1
if i <= len(para_list):
init_combination.extend(list(itertools.combinations(iterable=para_list, r=i)))
else:
pass
return init_combination
create_combination([1,2,3,4,5,6])
参数为一个可迭代的对象,这里传入的是一个列表,也可以用一个列表生成器来表达
上图打印出来的结果是:
[(1,), (2,), (3,), (4,), (5,), (6,), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 3), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6), (4, 5), (4, 6), (5, 6), (1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 2, 6), (1, 3, 4), (1, 3, 5), (1, 3, 6), (1, 4, 5), (1, 4, 6), (1, 5, 6), (2, 3, 4), (2, 3, 5), (2, 3, 6), (2, 4, 5), (2, 4, 6), (2, 5, 6), (3, 4, 5), (3, 4, 6), (3, 5, 6), (4, 5, 6), (1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 3, 6), (1, 2, 4, 5), (1, 2, 4, 6), (1, 2, 5, 6), (1, 3, 4, 5), (1, 3, 4, 6), (1, 3, 5, 6), (1, 4, 5, 6), (2, 3, 4, 5), (2, 3, 4, 6), (2, 3, 5, 6), (2, 4, 5, 6), (3, 4, 5, 6), (1, 2, 3, 4, 5), (1, 2, 3, 4, 6), (1, 2, 3, 5, 6), (1, 2, 4, 5, 6), (1, 3, 4, 5, 6), (2, 3, 4, 5, 6), (1, 2, 3, 4, 5, 6)]
会打印出选1中情况到选6中情况的所有组合
- 计算排列组合的总数
python提供的scipy
模块提供计算排列组合的具体数值,方法comb计算的是组合的具体数值,方法perm计算的是排列的具体数值
from scipy.special import comb,perm
a=comb(4,2) #4*3/2=6
b=perm(4,2) #4*3=12
print(a)
print(b)
可以看到打印的结果分别为6和12 ,代表4个数中选择2个的组合有6种情况,4个数中选择2个进行排列的情况有12种