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

Posted xiaojinniu425

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python小技巧:使用*解包和itertools.product()求笛卡尔积(转)相关的知识,希望对你有一定的参考价值。

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],12]
for i in itertools.product(*list1):
     print(i)
>>>
(a, 1)
(a, 2)
(b, 1)
(b, 2)

 

以上是关于Python小技巧:使用*解包和itertools.product()求笛卡尔积(转)的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向ApkTool 工具使用 ( ApkTool 简介 | ApkTool 解包和打包 )

Android 逆向ApkTool 工具使用 ( ApkTool 简介 | ApkTool 解包和打包 )

习题13 参数解包和变量

Python编程特殊小技巧汇集

Itertools 产品 V​​alueError:解包的值太多(预期为 2)

使用apktool解包和打包apk