之前写过《python组合求和》,使用python排列组合itertools模块combinations函数,本文对该模块的排列组合功能进行整理
官方文档:《itertools — 为高效循环而创建迭代器的函数 — Python 3.7.12 文档》
排列
排列:从n个不同元素中,任取m个(m≤n)不同的元素按照一定的顺序排成一列
排列个数公式:P(n,m) = n!/(n-m)!,当n=m即全排列时为n!个
from itertools import permutations
def permut(list_n, m=1):
"""
对列表中的n个元素,任取m个排列,排列有序,当元素有重复时,排列也有重复
:param list list_n: 列表,元素个数n
:param int m: 排列内元素个数,m>n返回空列表
"""
result = list(permutations(list_n, m))
return result
排列写入excel
import time
import pandas as pd
from itertools import permutations
def permut_xlsx(list_n, m=1):
"""
排列结果写入Excel文件,使用pandas
:param list list_n: 列表,元素个数n
:param int m: 排列内元素个数,m>n返回空列表
"""
start_time = time.time()
filename = r'E:\测试\python排列.xlsx'
writer = pd.ExcelWriter(filename)
sheet_name = 'Sheet1'
result = list(permutations(list_n, m))
df = pd.DataFrame(result) # 转为二维数据结构,便于写入Excel
# 写入文件,文件不存在则创建(但sheet名称不行);行、列头不写入
df.to_excel(writer,sheet_name,header=False,index=False)
writer.save()
print('所有排列写入完成,用时:%.4f秒' % (time.time() - start_time))
组合
组合:从n个不同元素中,任取m个(m≤n)元素并成一组
组合个数公式:C(n,m) = P(n,m)/m! = n!/(m!(n-m)!)
from itertools import combinations
def combin(list_n, m=1):
"""
对列表中的n个元素,任取m个组合,组合无序,当元素有重复时,组合也有重复
:param list list_n: 列表,元素个数n
:param int m: 组合内元素个数,m>n返回空列表
"""
result = list(combinations(list_n, m)) # 简洁高效写法
return result
所有组合
import time
from itertools import combinations
def combin_all(list_n, m=0):
"""
对列表中的n个元素,任取m个组合,组合无序,当元素有重复时,组合也有重复
:param list list_n: 列表,元素个数n
:param int m: 组合内元素个数,m>n返回空列表
返回结果:列表内嵌套元组[(),()]
注意:m=0时返回所有的组合,但数据量大时容易爆内存(25个以内)
"""
start_time = time.time()
result = []
if m < 0 or not isinstance(m, int):
print('参数异常,m应为自然数')
return []
elif m > len(list_n): # 当 m>n 时返回空列表
print('参数异常,m>n')
return []
elif m == 0: # 与之前保持一致,m=0时返回所有的组合,组合个数(2^n - 1)
for i in range(1, len(list_n)+1):
result += list(combinations(list_n, i)) # 迭代器写入列表
print('所有组合都已生成,用时:%.4f秒' % (time.time() - start_time))
return result
else: # 一般情况,只返回限定m的组合
result += list(combinations(list_n, m)) # 迭代器写入列表
print('所有组合都已生成,用时:%.4f秒' % (time.time() - start_time))
return result