尝试为真值表生成函数编写代码时出现此问题。
如何生成所有长度为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列表的所有组合的排列。
答案 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
情况一样,将其视为包含三个位的值。
从0
到2ⁿ - 1
(包括整数)循环(使用整数),并打印每个值中的所有位(其中0
为False
,而1
为True
)。然后,您将拥有所有排列。
当然,这不是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 documentation的U9-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。