標籤:自己 實用 技巧 code tco style func 字串 eval
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()求笛卡爾積(轉)