如何使用itertools计算包含重复元素的所有组合?

6 投票
2 回答
8216 浏览
提问于 2025-04-18 07:25

我尝试使用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')
>>>

撰写回答