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多线程编程(一):threading模块综述
Apr 05 Python
详解Python网络爬虫功能的基本写法
Jan 28 Python
python魔法方法-属性访问控制详解
Jul 25 Python
Django开发中的日志输出的方法
Jul 02 Python
Sanic框架基于类的视图用法示例
Jul 18 Python
用于业余项目的8个优秀Python库
Sep 21 Python
Python 实现异步调用函数的示例讲解
Oct 14 Python
python数据处理之如何选取csv文件中某几行的数据
Sep 02 Python
python应用文件读取与登录注册功能
Sep 23 Python
Django Serializer HiddenField隐藏字段实例
Mar 31 Python
如何快速一次性卸载所有python包(第三方库)呢
Oct 20 Python
Python循环之while无限迭代
Apr 30 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制作静态网站的模板框架(一)
2006/10/09 PHP
php foreach正序倒序输出示例代码
2014/07/01 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
简单JS代码压缩器
2006/10/12 Javascript
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
jQuery LigerUI 使用教程入门篇
2012/01/18 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
js选项卡的实现方法
2015/02/09 Javascript
详解JavaScript中的4种类型识别方法
2015/09/14 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
JS模拟实现ECMAScript5新增的数组方法
2017/03/20 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
[36:19]2018DOTA2亚洲邀请赛 小组赛 A组加赛 Newbee vs LGD
2018/04/03 DOTA
浅谈python中的实例方法、类方法和静态方法
2017/02/17 Python
python中判断文件编码的chardet(实例讲解)
2017/12/21 Python
Windows上使用Python增加或删除权限的方法
2018/04/24 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
python制作图片缩略图
2019/04/30 Python
Flask模板引擎之Jinja2语法介绍
2019/06/26 Python
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
2019/07/19 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
厨师岗位职责
2013/11/12 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
观看安全警示教育片心得体会
2016/01/15 职场文书
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android