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实现Windows上气泡提醒效果的方法
Jun 03 Python
python PIL模块与随机生成中文验证码
Feb 27 Python
Python爬虫实例爬取网站搞笑段子
Nov 08 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
Feb 07 Python
python 实现登录网页的操作方法
May 11 Python
python 切换root 执行命令的方法
Jan 19 Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 Python
Python之NumPy(axis=0 与axis=1)区分详解
May 27 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
Feb 18 Python
使用matplotlib动态刷新指定曲线实例
Apr 23 Python
python中scipy.stats产生随机数实例讲解
Feb 19 Python
python如何做代码性能分析
Apr 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 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
js图片向右一张张滚动效果实例代码
2013/11/23 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
2014/10/14 Javascript
Javascript中匿名函数的调用与写法实例详解(多种)
2016/01/26 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
2016/02/17 Javascript
easyui window refresh 刷新两次的解决方法(推荐)
2016/05/18 Javascript
jQuery焦点图左右转换效果
2016/12/12 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
JS库之Three.js 简易入门教程(详解之一)
2017/09/13 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
2017/12/29 Javascript
vue日历/日程提醒/html5本地缓存功能
2019/09/02 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
如何在微信小程序中存setStorage
2019/12/13 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
Python实现一个服务器监听多个客户端请求
2018/04/12 Python
pandas条件组合筛选和按范围筛选的示例代码
2019/08/26 Python
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
Java面向对象面试题
2016/12/26 面试题
自荐书格式
2013/12/01 职场文书
论文指导教师评语
2014/04/28 职场文书
建筑安全责任书范本
2014/07/24 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
Elasticsearch 基本查询和组合查询
2022/04/19 Python
MySQL深分页问题解决思路
2022/12/24 MySQL