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 相关文章推荐
django初始化数据库的实例
May 27 Python
Python做智能家居温湿度报警系统
Sep 25 Python
django解决跨域请求的问题详解
Jan 20 Python
通过实例解析python描述符原理作用
Jan 22 Python
pytorch中使用cuda扩展的实现示例
Feb 12 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
Feb 20 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
python 画图 图例自由定义方式
Apr 17 Python
python线性插值解析
Jul 05 Python
python如何调用java类
Jul 05 Python
Django中的JWT身份验证的实现
May 07 Python
python opencv通过按键采集图片源码
May 20 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二分法在IP地址查询中的应用
2008/08/12 PHP
修改php.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
javascript一些不错的函数脚本代码
2008/09/10 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
jquery 面包屑导航 具体实现
2013/06/05 Javascript
javascript实例--教你实现扑克牌洗牌功能
2014/05/15 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
bootstrap fileinput组件整合Springmvc上传图片到本地磁盘
2017/05/11 Javascript
浅谈 Vue v-model指令的实现原理
2017/06/08 Javascript
微信小程序 获取javascript 里的数据
2017/08/17 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
详解简单易懂的 ES6 Iterators 指南和示例
2019/09/24 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
python网络编程实例简析
2014/09/26 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
python 3调用百度OCR API实现剪贴板文字识别
2018/09/04 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
python验证身份证信息实例代码
2019/05/06 Python
解决Django一个表单对应多个按钮的问题
2019/07/18 Python
Python数据库小程序源代码
2019/09/15 Python
Python笔记之代理模式
2019/11/20 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
2016/03/15 HTML / CSS
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
大学自我评价
2014/02/12 职场文书
与美同行演讲稿
2014/09/13 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
导游词范文之颐和园/重庆/云台山
2019/09/10 职场文书
如何用JavaScript学习算法复杂度
2021/04/30 Javascript
Moment的feature导致线上bug解决分析
2022/09/23 Javascript