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爬虫之百度API调用方法
Jun 11 Python
Python实现查看系统启动项功能示例
May 10 Python
详解Python发送email的三种方式
Oct 18 Python
ERLANG和PYTHON互通实现过程详解
Jul 05 Python
python模拟键盘输入 切换键盘布局过程解析
Aug 15 Python
python Popen 获取输出,等待运行完成示例
Dec 30 Python
Python读取excel文件中带公式的值的实现
Apr 17 Python
Python性能分析工具py-spy原理用法解析
Jul 27 Python
彻底搞懂python 迭代器和生成器
Sep 07 Python
jupyter notebook 写代码自动补全的实现
Nov 02 Python
Django自定义YamlField实现过程解析
Nov 11 Python
Python实现双向链表基本操作
May 25 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
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
destoon整合UCenter图文教程
2014/06/21 PHP
php下Memcached入门实例解析
2015/01/05 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
2015/03/04 PHP
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
js字符串转换成xml对象并使用技巧解读
2013/04/18 Javascript
jquery获取子节点和父节点的示例代码
2013/09/10 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
Three.js快速入门教程
2016/09/09 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
javascript实现抢购倒计时程序
2019/08/26 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
[04:26]DOTA2上海特锦赛小组赛第二日 TOP10精彩集锦
2016/02/27 DOTA
Python3学习urllib的使用方法示例
2017/11/29 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
Python气泡提示与标签的实现
2020/04/01 Python
学python最电脑配置有要求么
2020/07/05 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
HTML5 Canvas中绘制矩形实例
2015/01/01 HTML / CSS
Java程序开发中如何应用线程
2016/03/03 面试题
《夹竹桃》教学反思
2014/04/20 职场文书
慰问敬老院活动总结
2014/04/26 职场文书
优秀班主任申报材料
2014/12/16 职场文书
团组织推荐意见
2015/06/05 职场文书
python3 删除所有自定义变量的操作
2021/04/08 Python
Pytest中conftest.py的用法
2021/06/27 Python
利用Matlab绘制各类特殊图形的实例代码
2021/07/16 Python
Python之matplotlib绘制折线图
2022/04/13 Python