python排列组合函数

之前写过《python组合求和》,使用python排列组合itertools模块combinations函数,本文对该模块的排列组合功能进行整理
官方文档:《itertools — 为高效循环而创建迭代器的函数 — Python 3.7.12 文档》

目录

    • 排列
      • 排列写入excel
    • 组合
      • 所有组合

排列

排列:从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

你可能感兴趣的:(excel,python,python,pandas)