python中的排列组合,itertools模块和scipy模块

在实际工作中,我们往往需要计算一些数据的排列和组合情况,比如一组参数中有多少种组合方式,而python已经为我们提供了一个内置模块itertools

一、itertools用法

itertool模块中提供了两个常用的函数,分别为combinations(iterable, k)和permutations(iterable, k)。

  1. combinations(iterable, k)即我们平常说的组合,就是不分顺序的,数学上表达为 C m k C^{k}_m Cmk,其中k就是参数中的k,m指的是可迭代的对象,可以为列表,元祖,字典
  2. permutations(iterable, k)即我们平常说的排列,排列就是区分顺序的,如12和21表示两个不同的排列,数学上表达式为 A m k A^{k}_m Amk,代表的是从m中数据中取出k中进行排列
二、代码实现
  1. 计算组合
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模块

  1. 计算排列
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中情况的所有组合

  1. 计算排列组合的总数
    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种

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值