W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
你想迭代遍歷一個(gè)集合中元素的所有可能的排列或組合
itertools模塊提供了三個(gè)函數(shù)來解決這類問題。其中一個(gè)是 itertools.permutations()
,它接受一個(gè)集合并產(chǎn)生一個(gè)元組序列,每個(gè)元組由集合中所有元素的一個(gè)可能排列組成。也就是說通過打亂集合中元素排列順序生成一個(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')
>>>
如果你想得到指定長度的所有排列,你可以傳遞一個(gè)可選的長度參數(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()
來講,元素的順序已經(jīng)不重要了。也就是說,組合 ('a', 'b')
跟 ('b', 'a')
其實(shí)是一樣的(最終只會(huì)輸出其中一個(gè))。
在計(jì)算組合的時(shí)候,一旦元素被選取就會(huì)從候選中剔除掉(比如如果元素'a'已經(jīng)被選取了,那么接下來就不會(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')
>>>
這一小節(jié)我們向你展示的僅僅是itertools模塊的一部分功能。盡管你也可以自己手動(dòng)實(shí)現(xiàn)排列組合算法,但是這樣做得要花點(diǎn)腦力。當(dāng)我們碰到看上去有些復(fù)雜的迭代問題時(shí),最好可以先去看看itertools模塊。如果這個(gè)問題很普遍,那么很有可能會(huì)在里面找到解決方案!
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: