Генерировать все длины-n перестановок True / False? - PullRequest
0 голосов
/ 06 января 2019

Эта проблема возникла при попытке написать код для функции генерации таблицы истинности.

Как мне сгенерировать список списков всех перестановок длины-n True и False? Другими словами, учитывая список элементов [True, False], как я могу сгенерировать все перестановки всех возможных комбинаций длины-n этих элементов?

Например:

n=2 Длина-2 перестановки:

[[True, True], [True, False], [False, True], [False, False]]

n=3 Перестановки длины-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 ^ n списков. Я также рассмотрел использование itertools.product, но это, кажется, дает перестановок определенной комбинации . В этом случае, я думаю, что я хочу генерировать перестановки ВСЕХ комбинаций из длины-n списка истина / ложь.

Ответы [ 6 ]

0 голосов
/ 06 января 2019

И если вам нужен список списков, а не список кортежей, начните с U9-Forward s answer :

import itertools
l=[False,True]
ll=list(itertools.product(l,repeat=3))

и продолжить:

lll=[]
for each in ll:
    lll.append([EACH for EACH in each])

lll будет списком, а не кортежами.


Намного лучше, следующие комментарии:

[list(elem) for elem in lll]

Благодаря Кевину .

0 голосов
/ 06 января 2019

Попробуйте itertools.product с аргументом repeat:

In [1]: from itertools import product

In [2]: product([True, False], repeat=2)
Out[2]: <itertools.product at 0x1c7eff51b40>

Как вы можете видеть выше, он возвращает итерацию, поэтому оберните его в list():

In [3]: list(product([True, False], repeat=2))
Out[3]: [(True, True), (True, False), (False, True), (False, False)]

In [4]: list(product([True, False], repeat=3))
Out[4]:
[(True, True, True),
 (True, True, False),
 (True, False, True),
 (True, False, False),
 (False, True, True),
 (False, True, False),
 (False, False, True),
 (False, False, False)]

In [5]: list(product([True, False], repeat=5))
Out[5]:
[(True, True, True, True, True),
 (True, True, True, True, False),
 (True, True, True, False, True),
 (True, True, True, False, False),
 (True, True, False, True, True),
...

Он также возвращает список кортежей вместо списка списков, но это подходит для большинства случаев использования и может быть очень легко решено с помощью понимания списка, если списки действительно необходимы:

[list(tup) for tup in mylist]
0 голосов
/ 06 января 2019

Относительно легко, если вместо этого вы считаете значения битами . Как и в случае n = 3, воспринимайте его как значение, содержащее три бита.

Цикл (с использованием целых чисел) от 0 до 2ⁿ - 1 (включительно) и печать всех битов в каждом значении (с 0, равным False и 1, равным True). Тогда у вас будут все перестановки.

Конечно, это не очень Pythonic решение, но оно общее.

0 голосов
/ 06 января 2019

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

>>> import itertools
>>> l=[False,True]
>>> list(itertools.product(l,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)]
>>> 

И составить список:

>>> import itertools
>>> l=[False,True]
>>> [list(i) for i in itertools.product(l,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]]
>>> 
0 голосов
/ 06 января 2019

РЕДАКТИРОВАТЬ: Похоже, я не проверял вывод, прежде чем отправлять свой ответ. Он останется таким же, каким был бы правильный путь, был бы дубликат ответа правильного ответа.

Используйте этот простой код:

>>> import itertools  # library of magic
>>> length = 3        # length of your wanted permutations
>>> result = itertools.combinations(    # combinations based on position
...     [*[True, False] * length],      # generates the items needed
...     length                          # length of the wanted results
... )
>>> print([list(r) for in result])
[[False, False, False], [False, False, True], [False, True, False], [False, True, True], [True, False, False], [True, False, True], [True, True, False], [True, True, True]]
0 голосов
/ 06 января 2019

Это не эффективное решение, но вы можете использовать:

def permuteBool(n, l):
...      if n==0:
...         return l
...      return [permuteBool(n-1, l+[True])] + [permuteBool(n-1, l+[False])]
... 
>>> permuteBool(3, [])
[[[[True, True, True], [True, True, False]], [[True, False, True], [True, False, False]]], [[[False, True, True], [False, True, False]], [[False, False, True], [False, False, False]]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...