zoukankan      html  css  js  c++  java
  • python基础:求笛卡尔积(itertools.product())

    一、【问题】
    目前有一字符串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语法错误。product(*li),li为可迭代器即可。
    例如,在这道题中,就可以写成:
    1 for i in itertools.product(*eval(s)):
    2     print i
    就可以出来结果了。
     
    这个问题用到的三个技巧:
    (1)itertools.product()求笛卡尔积。itertools这个模块中有相当多的牛逼闪闪的数学算法,比如全排列函数permutations,组合函数combinations等等,有时候想要一个数学类的函数又不想自己写,可以在这里找找,没准有惊喜。
    (2)eval()字符串求值。eval和exec这两个python中的逆天函数,强大到让人不太放心其安全性。
    (3)*解包。上面已经解释过了,其实用到的场合感觉挺有限的,有印象即可,能在无路可走的时候灵光一现就好,别太指望它给你的程序带来多大好处。
     
    二、itertools.product(字符串,repeat=n)
    1 for i in itertools.product('ABCD',repeat=2):
    2     print("{}{}".format(i[0],i[1]))
    View Code

    输出为:

    AA
    AB
    AC
    AD
    BA
    BB
    BC
    BD
    CA
    CB
    CC
    CD
    DA
    DB
    DC
    DD

  • 相关阅读:
    LeetCode 788. Rotated Digits
    LeetCode 606. Construct String from Binary Tree
    LeetCode 13. Roman to Integer
    LeetCode 387. First Unique Character in a String
    LeetCode 520. Detect Capital
    LeetCode 557. Reverse Words in a String III
    RSA加密算法及其与SpringMVC集成
    用phantomjs 进行网页整页截屏
    redis应用场景
    MQ产品比较-ActiveMQ-RocketMQ
  • 原文地址:https://www.cnblogs.com/yizhenfeng168/p/6934260.html
Copyright © 2011-2022 走看看