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简单格式化时间的方法【strftime函数】
Sep 18 Python
Python使用matplotlib绘制余弦的散点图示例
Mar 14 Python
利用python打开摄像头及颜色检测方法
Aug 03 Python
python使用PIL给图片添加文字生成海报示例
Aug 17 Python
Pycharm无法使用已经安装Selenium的解决方法
Oct 13 Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 Python
Python饼状图的绘制实例
Jan 15 Python
Python之时间和日期使用小结
Feb 14 Python
Python3监控疫情的完整代码
Feb 20 Python
python+selenium+chromedriver实现爬虫示例代码
Apr 10 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
Nov 02 Python
Python OpenCV实现图形检测示例详解
Apr 08 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
很温暖很温暖的Lester Young
2021/03/03 冲泡冲煮
《PHP编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
php获取数组元素中头一个数组元素值的实现方法
2014/12/20 PHP
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
详解js异步文件加载器
2016/01/24 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
phpStorm2020 注册码
2020/09/17 PHP
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
JavaScript操作Cookie方法实例分析
2015/05/27 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
微信小程序 地图map实例详解
2017/06/07 Javascript
Angular 4.X开发实践中的踩坑小结
2017/07/04 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
python抓取网页内容示例分享
2014/02/24 Python
python实现字符串和日期相互转换的方法
2015/05/13 Python
python构建深度神经网络(续)
2018/03/10 Python
Python中文件的读取和写入操作
2018/04/27 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
python tkinter canvas使用实例
2019/11/04 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
基于python traceback实现异常的获取与处理
2019/12/13 Python
TensorFlow学习之分布式的TensorFlow运行环境
2020/02/05 Python
Python代码注释规范代码实例解析
2020/08/14 Python
成考报名单位证明范本
2014/01/16 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
2015年社区党建工作汇报材料
2015/06/25 职场文书
同事欢送会致辞
2015/07/31 职场文书
详解Flask开发技巧之异常处理
2021/06/15 Python
Pandas自定义选项option设置
2021/07/25 Python
Python如何快速找到多个字典中的公共键(key)
2022/04/29 Python