Python小技巧:使用*解包和itertools.product()求笛卡爾積

來源:互聯網
上載者:User

標籤:自己   實用   技巧   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()求笛卡爾積(轉)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.