Создание матрицы опций с использованием itertools - PullRequest
7 голосов
/ 13 августа 2011

Я пытаюсь создать матрицу значений True и False, которая показывает все перестановки для заданного числа вариантов. Таким образом, для 5 вариантов вы получите следующий вывод.

F F F F F
T F F F F
T T F F F
T T T F F
...
F T F F F
...

Я искал использование перестановок и комбинаций itertool, но они отрабатывают позицию, а не значение, что приводит к дублированию.

Я уверен, что есть стандартный алгоритм для этой проблемы, но я изо всех сил пытаюсь найти его имя.

Ответы [ 3 ]

8 голосов
/ 13 августа 2011

Использование itertools.product :

itertools.product([False,True],repeat=5)

пример itertools.product([False,True],repeat=2):

(False, False)
(False, True)
(True, False)
(True, True)
4 голосов
/ 13 августа 2011

Вы, похоже, хотите n-мерное декартово произведение [False, True].

>>> print list(itertools.product(*(itertools.repeat((False, True), 3))))
[(False, False, False), (False, False, True), (False, True, False), 
 (False, True, True), (True, False, False), (True, False, True), 
 (True, True, False), (True, True, True)]

или более кратко (воровство у Фредерик )

>>> print list(itertools.product((False, True), repeat=3))
[(False, False, False), (False, False, True), (False, True, False), 
(False, True, True), (True, False, False), (True, False, True), 
(True, True, False), (True, True, True)]
2 голосов
/ 13 августа 2011

Это та же форма, что и двоичное представление целых чисел от 0 до (2 ** n) -1. Если вы склонны к такому извращению, вы могли бы представлять целые числа в виде двоичных строк с нулевым заполнением, используя str.format (), а затем приводить строку (в форме "00101") в логический список, делая что-то ужасно, как это:

>>> n = 5
>>> for i in xrange(2**n):
...     [bool(int(j)) for j in ("{0:0>%db}" % n).format(i)]

Представленное выше n-мерное декартово произведение - это, я уверен, правильный способ думать об этом, но этот способ заставил меня хихикнуть.

...