1.
思考
:有的時(shí)候系羞,我們希望對(duì)一系列元素所有可能的組合或者排列進(jìn)行迭代。-
2.
解決方法
:使用itertools
模塊中提供的函數(shù)-
itertools.permutations()
:以一個(gè)元素集合作為此方法的參數(shù)猛蔽,將某個(gè)元素集合中的所有元素重排列為所有可能的元祖序列,并返回按灶。打亂元素順序
-
>>> items = ['a','b','c','d','e']
>>> from itertools import permutations
>>> for per in permutations(items):
print(per)
('a', 'b', 'c', 'd', 'e')
('a', 'b', 'c', 'e', 'd')
('a', 'b', 'd', 'c', 'e')
('a', 'b', 'd', 'e', 'c')
('a', 'b', 'e', 'c', 'd')
('a', 'b', 'e', 'd', 'c')
('a', 'c', 'b', 'd', 'e')
('a', 'c', 'b', 'e', 'd')
('a', 'c', 'd', 'b', 'e')
('a', 'c', 'd', 'e', 'b')
('a', 'c', 'e', 'b', 'd')
('a', 'c', 'e', 'd', 'b')
('a', 'd', 'b', 'c', 'e')
('a', 'd', 'b', 'e', 'c')
('a', 'd', 'c', 'b', 'e')
('a', 'd', 'c', 'e', 'b')
('a', 'd', 'e', 'b', 'c')
('a', 'd', 'e', 'c', 'b')
('a', 'e', 'b', 'c', 'd')
('a', 'e', 'b', 'd', 'c')
('a', 'e', 'c', 'b', 'd')
('a', 'e', 'c', 'd', 'b')
('a', 'e', 'd', 'b', 'c')
('a', 'e', 'd', 'c', 'b')
('b', 'a', 'c', 'd', 'e')
('b', 'a', 'c', 'e', 'd')
('b', 'a', 'd', 'c', 'e')
('b', 'a', 'd', 'e', 'c')
('b', 'a', 'e', 'c', 'd')
('b', 'a', 'e', 'd', 'c')
('b', 'c', 'a', 'd', 'e')
('b', 'c', 'a', 'e', 'd')
('b', 'c', 'd', 'a', 'e')
('b', 'c', 'd', 'e', 'a')
('b', 'c', 'e', 'a', 'd')
('b', 'c', 'e', 'd', 'a')
('b', 'd', 'a', 'c', 'e')
('b', 'd', 'a', 'e', 'c')
('b', 'd', 'c', 'a', 'e')
('b', 'd', 'c', 'e', 'a')
('b', 'd', 'e', 'a', 'c')
('b', 'd', 'e', 'c', 'a')
('b', 'e', 'a', 'c', 'd')
('b', 'e', 'a', 'd', 'c')
('b', 'e', 'c', 'a', 'd')
('b', 'e', 'c', 'd', 'a')
('b', 'e', 'd', 'a', 'c')
('b', 'e', 'd', 'c', 'a')
('c', 'a', 'b', 'd', 'e')
('c', 'a', 'b', 'e', 'd')
('c', 'a', 'd', 'b', 'e')
('c', 'a', 'd', 'e', 'b')
('c', 'a', 'e', 'b', 'd')
('c', 'a', 'e', 'd', 'b')
('c', 'b', 'a', 'd', 'e')
('c', 'b', 'a', 'e', 'd')
('c', 'b', 'd', 'a', 'e')
('c', 'b', 'd', 'e', 'a')
('c', 'b', 'e', 'a', 'd')
('c', 'b', 'e', 'd', 'a')
('c', 'd', 'a', 'b', 'e')
('c', 'd', 'a', 'e', 'b')
('c', 'd', 'b', 'a', 'e')
('c', 'd', 'b', 'e', 'a')
('c', 'd', 'e', 'a', 'b')
('c', 'd', 'e', 'b', 'a')
('c', 'e', 'a', 'b', 'd')
('c', 'e', 'a', 'd', 'b')
('c', 'e', 'b', 'a', 'd')
('c', 'e', 'b', 'd', 'a')
('c', 'e', 'd', 'a', 'b')
('c', 'e', 'd', 'b', 'a')
('d', 'a', 'b', 'c', 'e')
('d', 'a', 'b', 'e', 'c')
('d', 'a', 'c', 'b', 'e')
('d', 'a', 'c', 'e', 'b')
('d', 'a', 'e', 'b', 'c')
('d', 'a', 'e', 'c', 'b')
('d', 'b', 'a', 'c', 'e')
('d', 'b', 'a', 'e', 'c')
('d', 'b', 'c', 'a', 'e')
('d', 'b', 'c', 'e', 'a')
('d', 'b', 'e', 'a', 'c')
('d', 'b', 'e', 'c', 'a')
('d', 'c', 'a', 'b', 'e')
('d', 'c', 'a', 'e', 'b')
('d', 'c', 'b', 'a', 'e')
('d', 'c', 'b', 'e', 'a')
('d', 'c', 'e', 'a', 'b')
('d', 'c', 'e', 'b', 'a')
('d', 'e', 'a', 'b', 'c')
('d', 'e', 'a', 'c', 'b')
('d', 'e', 'b', 'a', 'c')
('d', 'e', 'b', 'c', 'a')
('d', 'e', 'c', 'a', 'b')
('d', 'e', 'c', 'b', 'a')
('e', 'a', 'b', 'c', 'd')
('e', 'a', 'b', 'd', 'c')
('e', 'a', 'c', 'b', 'd')
('e', 'a', 'c', 'd', 'b')
('e', 'a', 'd', 'b', 'c')
('e', 'a', 'd', 'c', 'b')
('e', 'b', 'a', 'c', 'd')
('e', 'b', 'a', 'd', 'c')
('e', 'b', 'c', 'a', 'd')
('e', 'b', 'c', 'd', 'a')
('e', 'b', 'd', 'a', 'c')
('e', 'b', 'd', 'c', 'a')
('e', 'c', 'a', 'b', 'd')
('e', 'c', 'a', 'd', 'b')
('e', 'c', 'b', 'a', 'd')
('e', 'c', 'b', 'd', 'a')
('e', 'c', 'd', 'a', 'b')
('e', 'c', 'd', 'b', 'a')
('e', 'd', 'a', 'b', 'c')
('e', 'd', 'a', 'c', 'b')
('e', 'd', 'b', 'a', 'c')
('e', 'd', 'b', 'c', 'a')
('e', 'd', 'c', 'a', 'b')
('e', 'd', 'c', 'b', 'a')
>>>
```
* 3.`使用方法2`:
* 提供一個(gè)可選長度參數(shù)肺孤,可得到以該參數(shù)為長度的所有全排列眶拉;
```python
>>> for per in permutations(items, 2):#2為參數(shù)
print(per)
('a', 'b')
('a', 'c')
('a', 'd')
('a', 'e')
('b', 'a')
('b', 'c')
('b', 'd')
('b', 'e')
('c', 'a')
('c', 'b')
('c', 'd')
('c', 'e')
('d', 'a')
('d', 'b')
('d', 'c')
('d', 'e')
('e', 'a')
('e', 'b')
('e', 'c')
('e', 'd')
```
* 4.`itertools.combinations()`:
* 產(chǎn)生輸入序列中所有元素的全部組合形式
```python
>>> from itertools import combinations
>>> for com in combinations(items, 3):
print(com)
('a', 'b', 'c')
('a', 'b', 'd')
('a', 'b', 'e')
('a', 'c', 'd')
('a', 'c', 'e')
('a', 'd', 'e')
('b', 'c', 'd')
('b', 'c', 'e')
('b', 'd', 'e')
('c', 'd', 'e')
>>> for com in combinations(items, 2):
print(com)
('a', 'b')
('a', 'c')
('a', 'd')
('a', 'e')
('b', 'c')
('b', 'd')
('b', 'e')
('c', 'd')
('c', 'e')
('d', 'e')
>>> for com in combinations(items, 1):
print(com)
('a',)
('b',)
('c',)
('d',)
('e',)
```
* 5.`注意`:
* `combinations()`:不考慮兩兩元素的順序千埃,例如選擇`('a', 'd')`和`('d', 'a')`二者中的一種組合。
* 6.`itertools.combinations_with_replacement()`:
* 允許多次選擇相同的元素
```python
>>> from itertools import combinations_with_replacement
>>> for com in combinations_with_replacement(items,2):
print(com)
('a', 'a')
('a', 'b')
('a', 'c')
('a', 'd')
('a', 'e')
('b', 'b')
('b', 'c')
('b', 'd')
('b', 'e')
('c', 'c')
('c', 'd')
('c', 'e')
('d', 'd')
('d', 'e')
('e', 'e')
>>>
```