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 相关文章推荐
python3图片转换二进制存入mysql
Dec 06 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
python魔法方法-属性转换和类的表示详解
Jul 22 Python
深入浅析python 中的匿名函数
May 21 Python
Pandas:DataFrame对象的基础操作方法
Jun 07 Python
超简单使用Python换脸实例
Mar 27 Python
python mac下安装虚拟环境的图文教程
Apr 12 Python
如何使用Python实现斐波那契数列
Jul 02 Python
python实现本地批量ping多个IP的方法示例
Aug 07 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
May 23 Python
python中使用np.delete()的实例方法
Feb 01 Python
给numpy.array增加维度的超简单方法
Jun 02 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/12/13 PHP
自动分页的不完整解决方案
2007/01/12 PHP
Yii2增加验证码步骤详解
2016/04/25 PHP
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
JS快速实现简单计算器
2020/04/08 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
如何在 Django 模板中输出 &quot;{{&quot;
2020/01/24 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
Pytorch 高效使用GPU的操作
2020/06/27 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
2021/01/22 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
2019年Java面试必问之经典试题
2012/09/12 面试题
应届本科生推荐信范文
2013/12/25 职场文书
英语商务邀请函范文
2014/01/16 职场文书
简历的自我评价
2014/02/03 职场文书
学校教研活动总结
2014/07/02 职场文书
合唱兴趣小组活动总结
2014/07/10 职场文书
2014年评职称工作总结
2014/11/20 职场文书
公司更名通知函
2015/04/24 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
红高粱观后感
2015/06/10 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书