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中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
python正则分析nginx的访问日志
Jan 17 Python
python抓取文件夹的所有文件
Feb 27 Python
Python简单基础小程序的实例代码
Apr 28 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
django用户登录验证的完整示例代码
Jul 21 Python
如何使用Flask-Migrate拓展数据库表结构
Jul 24 Python
树莓派极简安装OpenCv的方法步骤
Oct 10 Python
Python enumerate函数遍历数据对象组合过程解析
Dec 11 Python
Python单链表原理与实现方法详解
Feb 22 Python
python使用自定义钉钉机器人的示例代码
Jun 24 Python
利用Python网络爬虫爬取各大音乐评论的代码
Apr 13 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遍历数组的几种方法
2012/03/22 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
php基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
检测codeigniter脚本消耗内存情况的方法
2015/03/21 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
JavaScript延迟加载
2021/03/09 Javascript
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
JS排序之冒泡排序详解
2017/04/08 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
pytorch中的inference使用实例
2020/02/20 Python
python中id函数运行方式
2020/07/03 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
加拿大知名的国际儿童品牌:Hatley
2016/11/09 全球购物
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
Jar包的作用是什么
2014/03/30 面试题
历史专业学生的自我评价
2014/02/28 职场文书
个人年终总结怎么写
2015/03/09 职场文书
日本读研:怎样写好一篇日本研究计划书?
2019/07/15 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书
vue+element ui实现锚点定位
2021/06/29 Vue.js
OpenCV实现常见的四种图像几何变换
2022/04/01 Python
zabbix配置nginx监控的实现
2022/05/25 Servers