python排列组合函数

15 篇文章 2 订阅

之前写过《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
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔_51

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值