Как использовать 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'), которые, похоже, отсутствуют. Как рассчитать полный набор комбинаций?


person tmaric    schedule 23.05.2014    source источник


Ответы (2)


Похоже, вам нужно 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')
>>>
person Community    schedule 23.05.2014
comment
Верно. itertools.combinations_with_replacement сортирует элементы в каждом кортеже, поэтому вы получите только (a, a, b), а не (a, b, a) - person dano; 23.05.2014
comment
Это дает перестановки. - person Supertech; 17.04.2020

Для таких небольших последовательностей вы можете вообще не использовать 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')]
person Stefan van den Akker    schedule 23.05.2014