Python编程使用*解包和itertools.product()求笛卡尔积的方法


Posted in Python onDecember 18, 2017

本文实例讲述了Python编程使用*解包和itertools.product()求笛卡尔积的方法。分享给大家供大家参考,具体如下:

【问题】

目前有一字符串s = "['a', 'b'],['c', 'd']",想把它分开成为两个列表:

list1 = ['a', 'b']
list2 = ['c', 'd']

之后使用itertools.product()求笛卡尔积,应该写成:

for i in itertools.product(list1, list2):
  print i

结果为:

('a', 'c')
('a', 'd')
('b', 'c')
('b', 'd')

然而使用eval(s)获得的是一个元组。product的参数如果是元组则一定会报错(product的参数是两个列表,每个列表中的元素数量不定)。怎么破?

【解答】

其实只差一个*而已。*是python中一个赋值的技巧,叫做解包。相信很多人都见过def func(*args, **kwargs)这种写法,在函数中,*代表不定个数的参数,以tuple的方式传入,**则是以dict的方式。在使用函数的时候,也可以有类似的方法,调用func(*args)函数时,相当于把一个元组args拆开,当成参数传进函数中。只是这样做要小心的是,args中含有的元素数量及类型必须跟该函数定义一致,否则会报SyntaxError: invalid syntax语法错误。

例如,在这道题中,就可以写成:

for i in itertools.product(*eval(s)):
  print i

就可以出来结果了。

这个问题用到的三个技巧:

(1)itertools.product()求笛卡尔积。itertools这个模块中有相当多的牛逼闪闪的数学算法,比如全排列函数permutations,组合函数combinations等等,有时候想要一个数学类的函数又不想自己写,可以在这里找找,没准有惊喜。

(2)eval()字符串求值。eval和exec这两个python中的逆天函数,强大到让人不太放心其安全性。

(3)*解包。上面已经解释过了,其实用到的场合感觉挺有限的,有印象即可,能在无路可走的时候灵光一现就好,别太指望它给你的程序带来多大好处。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python打开网页和暂停实例
Sep 30 Python
Python判断值是否在list或set中的性能对比分析
Apr 16 Python
Python元组常见操作示例
Feb 19 Python
Python利用pandas处理Excel数据的应用详解
Jun 18 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
利用Python制作动态排名图的实现代码
Apr 09 Python
python 日志模块 日志等级设置失效的解决方案
May 26 Python
在Keras中实现保存和加载权重及模型结构
Jun 15 Python
keras的三种模型实现与区别说明
Jul 03 Python
Python txt文件常用读写操作代码实例
Aug 03 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 Python
通过Python 获取Android设备信息的轻量级框架
Dec 18 #Python
python中列表和元组的区别
Dec 18 #Python
Django REST为文件属性输出完整URL的方法
Dec 18 #Python
Python3计算三角形的面积代码
Dec 18 #Python
利用python解决mysql视图导入导出依赖的问题
Dec 17 #Python
python 3.5实现检测路由器流量并写入txt的方法实例
Dec 17 #Python
python中闭包Closure函数作为返回值的方法示例
Dec 17 #Python
You might like
php 数组的合并、拆分、区别取值函数集
2010/02/15 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
js格式化时间小结
2014/11/03 Javascript
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
js密码强度检测
2016/01/07 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
ES6学习教程之模板字符串详解
2017/10/09 Javascript
ES6的Fetch异步请求的实现方法
2018/12/07 Javascript
[01:37]全新的一集《真视界》——TI7总决赛
2017/09/21 DOTA
[43:32]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
Python ZipFile模块详解
2013/11/01 Python
python中cPickle用法例子分享
2014/01/03 Python
对python中的pop函数和append函数详解
2018/05/04 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
Bally巴利英国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/07 全球购物
幼儿园园长岗位职责
2013/11/26 职场文书
应届毕业生应聘自荐信
2013/12/07 职场文书
真诚的求职信
2014/07/04 职场文书
解放思想演讲稿
2014/09/11 职场文书
婚庆公司计划书
2014/09/15 职场文书
小学生校园广播稿
2014/09/28 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
员工安全责任协议书
2016/03/22 职场文书
街道办残联2016年助残日活动总结
2016/04/01 职场文书
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫