4.9 排列组å�ˆçš„è¿ä»£Â¶
问题¶
ä½ æƒ³è¿ä»£é��历一个集å�ˆä¸å…ƒç´ 的所有å�¯èƒ½çš„æŽ’列或组å�ˆ
解决方案¶
itertools模��供了三个函数�解决这类问题。
å…¶ä¸ä¸€ä¸ªæ˜¯ itertools.permutations() ,
它接å�—一个集å�ˆå¹¶äº§ç”Ÿä¸€ä¸ªå…ƒç»„åº�列,æ¯�个元组由集å�ˆä¸æ‰€æœ‰å…ƒç´ 的一个å�¯èƒ½æŽ’列组æˆ�。
也就是说通过打乱集å�ˆä¸å…ƒç´ 排列顺åº�生æˆ�一个元组,比如:
>>> 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')
>>>
å¦‚æžœä½ æƒ³å¾—åˆ°æŒ‡å®šé•¿åº¦çš„æ‰€æœ‰æŽ’åˆ—ï¼Œä½ å�¯ä»¥ä¼ 递一个å�¯é€‰çš„长度å�‚数。就åƒ�è¿™æ ·ï¼š
>>> 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',)
>>>
对于 combinations() æ�¥è®²ï¼Œå…ƒç´ 的顺åº�å·²ç»�ä¸�é‡�è¦�了。
也就是说,组å�ˆ ('a', 'b') è·Ÿ ('b', 'a') å…¶å®žæ˜¯ä¸€æ ·çš„(最终å�ªä¼šè¾“出其ä¸ä¸€ä¸ª)。
在计算组å�ˆçš„æ—¶å€™ï¼Œä¸€æ—¦å…ƒç´ 被选å�–就会从候选ä¸å‰”除掉(æ¯”å¦‚å¦‚æžœå…ƒç´ â€™a’已ç»�被选å�–了,那么接下æ�¥å°±ä¸�会å†�考虑它了)。
而函数 itertools.combinations_with_replacement() å…�许å�Œä¸€ä¸ªå…ƒç´ 被选择多次,比如:
>>> 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')
>>>
讨论¶
这一å°�节我们å�‘ä½ å±•ç¤ºçš„ä»…ä»…æ˜¯ itertools 模å�—的一部分功能。
å°½ç®¡ä½ ä¹Ÿå�¯ä»¥è‡ªå·±æ‰‹åŠ¨å®žçŽ°æŽ’åˆ—ç»„å�ˆç®—æ³•ï¼Œä½†æ˜¯è¿™æ ·å�šå¾—è¦�花点脑力。
当我们碰到看上去有些å¤�æ�‚çš„è¿ä»£é—®é¢˜æ—¶ï¼Œæœ€å¥½å�¯ä»¥å…ˆåŽ»çœ‹çœ‹itertools模å�—。
如果这个问题很普�,那么很有�能会在里�找到解决方案�