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中os.path用法分析
Jan 15 Python
在Python中marshal对象序列化的相关知识
Jul 01 Python
python发送HTTP请求的方法小结
Jul 08 Python
Python二分查找详解
Sep 13 Python
玩转python selenium鼠标键盘操作(ActionChains)
Apr 12 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
Python实现压缩和解压缩ZIP文件的方法分析
Sep 28 Python
python编写分类决策树的代码
Dec 21 Python
Python中shapefile转换geojson的示例
Jan 03 Python
对django2.0 关联表的必填on_delete参数的含义解析
Aug 09 Python
Python操作Mongodb数据库的方法小结
Sep 10 Python
Pycharm添加虚拟解释器报错问题解决方案
Oct 13 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
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
javascript编程起步(第五课)
2007/01/10 Javascript
用JS实现的一个include函数
2007/07/21 Javascript
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
AngularJS基础学习笔记之指令
2015/05/10 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
Vue.js项目部署到服务器的详细步骤
2017/07/17 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
解决Mac node版本升级失败的问题
2018/05/16 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
Node.js API详解之 module模块用法实例分析
2020/05/13 Javascript
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
Python callable内置函数原理解析
2020/03/05 Python
经贸日语毕业生自荐信
2013/11/03 职场文书
中专生职业生涯规划书范文
2013/12/29 职场文书
热门专业求职信
2014/05/24 职场文书
六一亲子活动总结
2014/07/01 职场文书
暑假学习心得体会
2014/09/02 职场文书
延安红色之旅心得体会
2014/10/07 职场文书
廉洁自律承诺书2015
2015/01/22 职场文书
爱国电影观后感
2015/06/19 职场文书