生成所有长度为n的True / False排列?

时间:2019-01-06 08:40:32

标签: python boolean permutation

尝试为真值表生成函数编写代码时出现此问题。

如何生成所有长度为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的true / false列表的所有组合的排列。

7 个答案:

答案 0 :(得分:5)

使用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]]
>>> 

答案 1 :(得分:2)

如果您认为这些值是 bits 相对容易。与n = 3情况一样,将其视为包含三个位的值。

02ⁿ - 1(包括整数)循环(使用整数),并打印每个值中的所有位(其中0False,而1True)。然后,您将拥有所有排列。

当然,这不是Python的解决方案,而是通用的。

答案 2 :(得分:1)

这是一个简单的递归列表程序

def list_exponential(n,set1=[]):
if n == 0:
    print(set1)
else:
    n-=1
    list_exponential(n, [False]+set1)
    list_exponential(n, [True]+set1)

list_exponential(5)

样本输出

$ python3 exponential.py 5
[False, False, False, False, False]
[True, False, False, False, False]
[False, True, False, False, False]
[True, True, False, False, False]
[False, False, True, False, False]
[True, False, True, False, False]
[False, True, True, False, False]
[True, True, True, False, False]
[False, False, False, True, False]
[True, False, False, True, False]
[False, True, False, True, False]
[True, True, False, True, False]
[False, False, True, True, False]
[True, False, True, True, False]
[False, True, True, True, False]
[True, True, True, True, False]
[False, False, False, False, True]
[True, False, False, False, True]
[False, True, False, False, True]
[True, True, False, False, True]
[False, False, True, False, True]
[True, False, True, False, True]
[False, True, True, False, True]
[True, True, True, False, True]
[False, False, False, True, True]
[True, False, False, True, True]
[False, True, False, True, True]
[True, True, False, True, True]
[False, False, True, True, True]
[True, False, True, True, True]
[False, True, True, True, True]
[True, True, True, True, True]

答案 3 :(得分:0)

这不是有效的解决方案,但您可以使用:

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]]]]

答案 4 :(得分:0)

编辑:看起来我在发布答案之前没有检查输出。它将保持原样,即正确答案的重复答案。

使用以下简单代码:

>>> 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]]

答案 5 :(得分:0)

使用repeat参数尝试itertools.product

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]

答案 6 :(得分:0)

如果要列表列表而不是元组列表,请以the documentationU9-Forward开头:

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]

感谢answer