Список комбинаций Python Itertool не является полным - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть список из 11 элементов, и мне нужны все возможные кортежи длиной 4 из него. Итак, я нашел функцию combinations в Itertools.

Однако, он поставляет только 210 кортежей вместо 11 ^ 4 = 14641. Я проверил с помощью функции print, и многие из них отсутствуют.

Что я могу сделать, или в чем проблема?

atom = [0, 5, 6, 12, 10, 13, 11, 9, 1, 2]
atoms = list(itertools.combinations(atom,4))

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Конечно - вы получаете все комбинации вашего списка (который содержит 10 элементов). combinations возвращает все отдельные неупорядоченные числа в вашем списке, объединенные в 4 элемента.

Количество возможных комбинаций - 10 на 4 - это (10 * 9 * 8 * 7/4 * 3 * 2 * 1), что в точности равно 210.

См. Также Калькулятор комбинаций

permuations может быть то, что вы хотите - он возвращает все упорядоченные комбинации - например, это даст [0 5 6 12], [5 0 6 12], тогда как combinations даст только [0 5 6 12] в этом случае.

Но permutations тоже не 11 ^ 4, а 10 * 9 * 8 * 7 элементов. Правильно будет 10 ^ 4 в вашем случае, может быть - и вы должны использовать product, если вы действительно хотите что-то вроде [0,0,0,0], [0,0,0,5] и т. д.

0 голосов
/ 06 ноября 2018

Вы ищете перестановка не комбинация . Комбинации не возвращаются

[1, 2, 3, 4] и [1, 3, 2, 4]

Они возвращают только разные наборы значений. Вы можете использовать перестановку следующим образом

list(itertools.permutations(atoms, 4))

если вы хотите получить такие значения, как следовать

[1, 1, 1, 2] и [1, 1, 2, 1]

Вам нужно написать product, как упоминал @Patrick Haugh

0 голосов
/ 06 ноября 2018

combinations дает вам кортежи в отсортированном порядке, без повторов. Звучит так, как будто вы вместо этого хотите itertools.product:

from itertools import product
atom = range(11)

print(len(list(product(atom, repeat=4))))
# 14641
...