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学习笔记_数据排序方法
May 22 Python
python的变量与赋值详细分析
Nov 08 Python
浅谈python正则的常用方法 覆盖范围70%以上
Mar 14 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
python中多层嵌套列表的拆分方法
Jul 02 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
Feb 21 Python
set在python里的含义和用法
Jun 24 Python
python读取.mat文件的数据及实例代码
Jul 12 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
解决python打开https出现certificate verify failed的问题
Sep 03 Python
python用Tkinter做自己的中文代码编辑器
Sep 07 Python
Python Spyder 调出缩进对齐线的操作
Feb 26 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表单转换textarea换行符的方法
2010/09/10 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
基于JQuery的一句代码实现表格的简单筛选
2010/07/26 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
javascript的document.referrer浏览器支持、失效情况总结
2014/07/18 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
bootstrap配合Masonry插件实现瀑布式布局
2017/01/18 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
Vue官方文档梳理之全局配置
2017/11/22 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
Python做简单的字符串匹配详解
2017/03/21 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
python中单例常用的几种实现方法总结
2018/10/13 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
德国网上超市:myTime.de
2019/08/26 全球购物
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
仓库管理专业个人的自我评价
2013/12/30 职场文书
爱情寄语大全
2014/04/09 职场文书
诚信考试倡议书
2014/04/15 职场文书
班级心理活动总结
2014/07/04 职场文书
教师师德承诺书2016
2016/03/25 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书