leetcode上做提示时候看到有高人用这个方法解题

【问题】
目前有一字符串s = "['a', 'b'],['c', 'd']",想把它分开成为两个列表:
list1 = ['a', 'b']
list2 = ['c', 'd']
之后使用itertools.product()求笛卡尔积,应该写成:
1 for i in itertools.product(list1, list2):
2 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语法错误。
例如,在这道题中,就可以写成:
1 for i in itertools.product(*eval(s)):
2 print i
就可以出来结果了。
 
这个问题用到的三个技巧:
(1)itertools.product()求笛卡尔积。itertools这个模块中有相当多的牛逼闪闪的数学算法,比如全排列函数permutations,组合函数combinations等等,有时候想要一个数学类的函数又不想自己写,可以在这里找找,没准有惊喜。
(2)eval()字符串求值。eval和exec这两个python中的逆天函数,强大到让人不太放心其安全性。
(3)*解包。上面已经解释过了,其实用到的场合感觉挺有限的,有印象即可,能在无路可走的时候灵光一现就好,别太指望它给你的程序带来多大好处。
 
=============================分割线========================
试验了下,加*的效果就是让列表内部的元素作为参数,不加就是单个列表是一个参数
list1 = ['ac', 'b']
for i in itertools.product(list1):
print(i)
>>>
('ac',)
('b',) list1 = ['ac', 'b']
for i in itertools.product(*list1):
print(i)
>>>
('a', 'b')
('c', 'b') list1 = [['a', 'b'],'']
for i in itertools.product(*list1):
print(i)
>>>
('a', '')
('a', '')
('b', '')
('b', '')

Python小技巧:使用*解包和itertools.product()求笛卡尔积(转)的更多相关文章

  1. Python小技巧:使用*解包和itertools.product()求笛卡尔积

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

  2. Python中的可变、不可变对象和赋值技巧序列解包

    可变对象和不可变对象 在python中一切皆对象.在Python中不存在所谓的值传递调用,一切传递都是对象的引用,也可认为是传址. python中,对象分为可变(mutable)和不可变(immuta ...

  3. 掌握这个Python小技巧,轻松构建cytoscape导入文件

    今天小编和大家分享如何借助Python脚本轻松构建cytoscape导入文件.Cytoscape是一个非常适合展示各种相互作用关系的可视化软件. 具体来说就是可以用于蛋白互作网络的展示,miRNA与蛋 ...

  4. python小技巧 小知识

    python小技巧 小知识 python系统变量(修改调用shell命令路径)或用户空间说明 20150418 python调用系统命令,报找不到.怎么办? 类似执行shell的: [ -f /etc ...

  5. python基础之打/解包及运算符与控制流程

    python基础之打/解包及运算符与控制流程 python中的解压缩(即序列类型的打包和解包) python提供了两个设计元祖和其他序列类型的处理的便利,也就是自动打包与自动解包功能,比如: data ...

  6. Python补充02 Python小技巧

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在这里列举一些我使用Python时积累的小技巧.这些技巧是我在使用Python过程 ...

  7. python 小技巧(import模块、查询类继承关系、安装包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在这里列举一些我使用Python时积累的小技巧.这些技巧是我在使用Python过程 ...

  8. 让你瞬间萌比的35个python小技巧

    今天在看python算法的时候,看到一篇关于python的小技巧.瞬间萌比了,原来python也可以这样玩,太神奇了.萌比的是原来这么简单的东西自己都不知道,虽然会写.废话不多说了,开始上菜. 1.拆 ...

  9. 能够让你装逼的10个Python小技巧

      列表推导式 你有一个list: bag = [1, 2, 3, 4, 5] 现在你想让所有元素翻倍,让它看起来是这个样子: [2, 4, 6, 8, 10] 大多初学者,根据之前语言的经验会大概这 ...

随机推荐

  1. Python 使用PyQt5进行开发(一)

    Qt  是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器. 我们先简单使用Qt进行一个小工 ...

  2. bash中的set, env, export unset的区别

    参考这篇文章很好 参考这篇文章2 -------------------------- == set显示的是当前shell的变量, 不同的shell, 它的私有变量是不同的 env是显示用户的变量, ...

  3. webService框架CXF的简单使用

    最近本来已经将上一个项目交活,全身心投入了另外项目的前端的开发工作.可之前的项目经理通知我,之前的项目需要做一个webService的功能,于是稍微做了一下webService,可是忘了通知我现在的项 ...

  4. c++ 事件回调 java

    #pragma once #ifdef __cplusplus extern "C" { #endif typedef void(*sig_t)(int); int FirstEl ...

  5. 项目中引入kafka

    项目如果需要引入kafka,可以从以下几个流程走: 1.pom文件引对应的jar包 <dependency> <groupId>org.apache.kafka</gro ...

  6. CSS3——盒子模型 border(边框) 轮廓(outline)属性 margin外边距 padding填充

    盒子模型 包括——边距,边框,填充,和实际内容 Margin(外边距) - 清除边框外的区域,外边距是透明的. Border(边框) - 围绕在内边距和内容外的边框. Padding(内边距) - 清 ...

  7. 操作系统(5)实验0——makefile的写法

    之前GCC那部分我提到过,gcc啥啥啥啥傻傻的那个指令只能够编译简单的代码,如果要干大事(例如突然心血来潮写个c开头的神经网络库之类的),还是要写Makefile来编译.其实在Windows下通常用I ...

  8. 2.proxychains----Macchanger----anonsurf

    nano /etc/proxychains.conf 激活dynamic_chain 同是启用proxy_dns 只启用IP会泄露DNS位置信息,别人就知道你在用匿名 ipconfig    ifco ...

  9. HashMap底层为什么一定用数组

    HashMap源码数据结构: Entry[] table = new Entry[capacity]; 其中,Entry就是一个链表节点.如果将数组替换成LinkedList是否可行?如下: List ...

  10. JS案例经验1

    一 可以通过设置在一个div中的多个div的定位属性为absolute,从而使得这几个元素重叠.他们都脱离了标准流. 二 对于absolute的left和right属性,当left和right同时出现 ...