Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例


Posted in Python onNovember 23, 2017

本文实例讲述了Python2.7基于笛卡尔积算法实现N个数组的排列组合运算。分享给大家供大家参考,具体如下:

说明:本人前段时间遇到的求n个数组的所有排列组合的问题,发现笛卡尔积算法可以解决,但是网上搜索的只有Java版本的实现,于是自己试着用python实现,由于新手代码不太规范。

代码:本人封装了一个类Cartesian(笛卡尔),其中封装了变量和方法:

1.变量

datagroup : 表示n个list(python 中的list与其他编程中的数组定义类似)的集合,即一个二维数组
counterIndex:datagroup反向下标值
counter : 用来记录当前datagroup中每一个数组输出的下标,初始全为0,因为从第一个开始输出

2.方法

countlength : 计算数组长度,即计算n的具体值
handle :处理datagoroup二维数组中每一个一维数组输出的下标值
assemble : 对datagoroup中的n个一维数组中的每一元素进行排列组合输出

# -*- coding:utf-8 -*-
# python 实现N个数组的排列组合(笛卡尔积算法)
class Cartesian():
  # 初始化
  def __init__(self, datagroup):
    self.datagroup = datagroup
    # 二维数组从后往前下标值
    self.counterIndex = len(datagroup)-1
    # 每次输出数组数值的下标值数组(初始化为0)
    self.counter = [0 for i in range(0, len(self.datagroup))]
  # 计算数组长度
  def countlength(self):
    i = 0
    length = 1
    while(i < len(self.datagroup)):
      length *= len(self.datagroup[i])
      i += 1
    return length
  # 递归处理输出下标
  def handle(self):
    # 定位输出下标数组开始从最后一位递增
    self.counter[self.counterIndex]+=1
    # 判断定位数组最后一位是否超过长度,超过长度,第一次最后一位已遍历结束
    if self.counter[self.counterIndex] >= len(self.datagroup[self.counterIndex]):
      # 重置末位下标
      self.counter[self.counterIndex] = 0
      # 标记counter中前一位
      self.counterIndex -= 1
      # 当标记位大于等于0,递归调用
      if self.counterIndex >= 0:
        self.handle()
      # 重置标记
      self.counterIndex = len(self.datagroup)-1
  # 排列组合输出
  def assemble(self):
    length = self.countlength()
    i = 0
    while(i < length):
      attrlist = []
      j = 0
      while(j<len(self.datagroup)):
        attrlist.append(self.datagroup[j][self.counter[j]])
        j += 1
      print attrlist
      self.handle()
      i += 1

测试:

注:测试代码中我只选取了长度为3的二维数组

if __name__ == "__main__":
  # 构造二维数组
  datagroup = [['aa1', ], ['bb1', 'bb2'], ['cc1', 'cc2', 'cc3']]
  # 创建cartesian对象
  cartesian = Cartesian(datagroup)
  cartesian.assemble()

输出结果:

Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例

备注:此算法实现用python2.7版本

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python 查找文件夹下所有文件 实现代码
Jul 01 Python
Python中for循环控制语句用法实例
Jun 02 Python
基于python 二维数组及画图的实例详解
Apr 03 Python
删除python pandas.DataFrame 的多重index实例
Jun 08 Python
python 并发编程 非阻塞IO模型原理解析
Aug 20 Python
Django url,从一个页面调到另个页面的方法
Aug 21 Python
Python 最强编辑器详细使用指南(PyCharm )
Sep 16 Python
基于Pytorch SSD模型分析
Feb 18 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
python 实现PIL模块在图片画线写字
May 16 Python
Django缓存Cache使用详解
Nov 30 Python
django项目中使用云片网发送短信验证码的实现
Jan 19 Python
深入理解Python3 内置函数大全
Nov 23 #Python
Python内置函数delattr的具体用法
Nov 23 #Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 #Python
Python3 操作符重载方法示例
Nov 23 #Python
Python3安装Scrapy的方法步骤
Nov 23 #Python
Python 和 JS 有哪些相同之处
Nov 23 #Python
深入理解Python分布式爬虫原理
Nov 23 #Python
You might like
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
2012/02/05 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
PHP获取二叉树镜像的方法
2018/01/17 PHP
php字符串过滤strip_tags()函数用法实例分析
2019/06/24 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
javascript void(0)的妙用
2009/10/21 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
2016/09/27 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
微信小程序页面生命周期详解
2018/01/31 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
微信小程序全局变量功能与用法详解
2019/01/22 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
python抓取京东商城手机列表url实例代码
2013/12/18 Python
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
深入解读Python解析XML的几种方式
2016/02/16 Python
Windows系统下PhantomJS的安装和基本用法
2018/10/21 Python
详解Python locals()的陷阱
2019/03/26 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
GDAL 矢量属性数据修改方式(python)
2020/03/10 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
M.M.LaFleur官网:美国职业女装品牌
2020/10/27 全球购物
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
商务英语专业求职信范文
2014/01/28 职场文书
合作意向协议书范本
2014/03/31 职场文书
岗位职责说明书模板
2014/07/30 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
化妆品促销活动总结
2015/05/07 职场文书
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server