如何使用itertools计算包含重复元素的所有组合?
我尝试使用itertools库来计算一个列表['a', 'b', 'c']
的所有组合,使用的是combinations_with_replacement
这个方法,允许元素重复。问题在于,似乎是用索引来区分这些元素:
这个方法会返回输入可迭代对象中长度为r的子序列,允许单个元素重复多次。
组合的输出是按字典序排列的。所以,如果输入的可迭代对象是排好序的,生成的组合元组也会是有序的。
元素是根据它们的位置被视为唯一的,而不是根据它们的值。所以如果输入的元素是唯一的,生成的组合也会是唯一的。
所以这段代码:
import itertools
for item in itertools.combinations_with_replacement(['a','b','c'], 3):
print (item)
产生了这样的输出:
('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')
而我需要的是组合集中包含像('a', 'b', 'a')
这样的元素,但似乎没有。怎么才能计算出完整的组合集呢?
2 个回答
3
对于这么小的序列,你完全可以不使用任何itertools
库:
abc = ("a", "b", "c")
print [(x, y, z) for x in abc for y in abc for z in abc]
# output:
[('a', 'a', 'a'),
('a', 'a', 'b'),
('a', 'a', 'c'),
('a', 'b', 'a'),
('a', 'b', 'b'),
('a', 'b', 'c'),
('a', 'c', 'a'),
('a', 'c', 'b'),
('a', 'c', 'c'),
('b', 'a', 'a'),
('b', 'a', 'b'),
('b', 'a', 'c'),
('b', 'b', 'a'),
('b', 'b', 'b'),
('b', 'b', 'c'),
('b', 'c', 'a'),
('b', 'c', 'b'),
('b', 'c', 'c'),
('c', 'a', 'a'),
('c', 'a', 'b'),
('c', 'a', 'c'),
('c', 'b', 'a'),
('c', 'b', 'b'),
('c', 'b', 'c'),
('c', 'c', 'a'),
('c', 'c', 'b'),
('c', 'c', 'c')]
15
听起来你想要使用 itertools.product
这个功能:
>>> from itertools import product
>>> for item in product(['a', 'b', 'c'], repeat=3):
... print item
...
('a', 'a', 'a')
('a', 'a', 'b')
('a', 'a', 'c')
('a', 'b', 'a')
('a', 'b', 'b')
('a', 'b', 'c')
('a', 'c', 'a')
('a', 'c', 'b')
('a', 'c', 'c')
('b', 'a', 'a')
('b', 'a', 'b')
('b', 'a', 'c')
('b', 'b', 'a')
('b', 'b', 'b')
('b', 'b', 'c')
('b', 'c', 'a')
('b', 'c', 'b')
('b', 'c', 'c')
('c', 'a', 'a')
('c', 'a', 'b')
('c', 'a', 'c')
('c', 'b', 'a')
('c', 'b', 'b')
('c', 'b', 'c')
('c', 'c', 'a')
('c', 'c', 'b')
('c', 'c', 'c')
>>>