《Python Cookbook 3rd》笔记(4.9):排列组合的迭代
排列組合的迭代
問(wèn)題
你想迭代遍歷一個(gè)集合中元素的所有可能的排列或組合
解法
itertools 模塊提供了三個(gè)函數(shù)來(lái)解決這類問(wèn)題。 其中一個(gè)是itertools.permutations() ,它接受一個(gè)集合并產(chǎn)生一個(gè)元組序列,每個(gè)元組由集合中所有元素的一個(gè)可能排列組成。也就是說(shuō)通過(guò)打亂集合中元素排列順序生成一個(gè)元組,比如:
>>> items = ['a', 'b', 'c'] >>> from itertools import permutations >>> for p in permutations(items): ... print(p) ... ('a', 'b', 'c') ('a', 'c', 'b') ('b', 'a', 'c') ('b', 'c', 'a') ('c', 'a', 'b') ('c', 'b', 'a') >>>如果你想得到指定長(zhǎng)度的所有排列,你可以傳遞一個(gè)可選的長(zhǎng)度參數(shù)。就像這樣:
>>> for p in permutations(items, 2): ... print(p) ... ('a', 'b') ('a', 'c') ('b', 'a') ('b', 'c') ('c', 'a') ('c', 'b') >>>使用 itertools.combinations() 可得到輸入集合中元素的所有的組合。比如:
>>> from itertools import combinations >>> for c in combinations(items, 3): ... print(c) ... ('a', 'b', 'c') >>> for c in combinations(items, 2): ... print(c) ... ('a', 'b') ('a', 'c') ('b', 'c') >>> for c in combinations(items, 1): ... print(c) ... ('a',) ('b',) ('c',) >>>對(duì)于 combinations() 來(lái)講,元素的順序已經(jīng)不重要了。也就是說(shuō),組合 (‘a(chǎn)’,‘b’) 跟 (‘b’, ‘a(chǎn)’) 其實(shí)是一樣的 (最終只會(huì)輸出其中一個(gè))。
在計(jì)算組合的時(shí)候,一旦元素被選取就會(huì)從候選中剔除掉(比如如果元素’a’已經(jīng)被選取了,那么接下來(lái)就不會(huì)再考慮它了)。而 函數(shù)itertools.combinations_with_replacement() 允許同一個(gè)元素被選擇多次,比如:
>>> for c in combinations_with_replacement(items, 3): ... print(c) ... ('a', 'a', 'a') ('a', 'a', 'b') ('a', 'a', 'c') ('a', 'b', 'b') ('a', 'b', 'c') ('a', 'c', 'c') ('b', 'b', 'b') ('b', 'b', 'c') ('b', 'c', 'c') ('c', 'c', 'c') >>>討論
盡管你也可以自己手動(dòng)實(shí)現(xiàn)排列組合算法,但是這樣做得要花點(diǎn)腦力。當(dāng)我們碰到看上去有些復(fù)雜的迭代問(wèn)題時(shí),最好可以先去看看 itertools 模塊。如果這個(gè)問(wèn)題很普遍,那么很有可能會(huì)在里面找到解決方案!
總結(jié)
以上是生活随笔為你收集整理的《Python Cookbook 3rd》笔记(4.9):排列组合的迭代的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用Python去除扫描型PDF中的水印
- 下一篇: Python外(5)-for-enume