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

11
在尝试编写真值表生成函数的代码时,出现了这个问题。
如何生成所有长度为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列表的所有组合的排列。


你的问题不太清楚,请再说明一下。 - U13-Forward
@U9-Forward 抱歉,我的表达能力不是很好。我添加了另一个例子。 - Anonymous
itertools 模块中还有其他函数。 - Klaus D.
1
你确定这是排列吗?排列是指“一组或多组事物可以被排序或排列的几种可能方式”。[True, True, True]不是True和False值的重新排列。 - zabop
@KM142646和Zabop,我更倾向于说“将集合{True, False}与自身的n次笛卡尔积”,我同意所请求的列表不同于集合{True, False}的排列组合(排列组合只有2个元素; {True, False}和{False, True})。 - AmirHosein Sadeghimanesh
这些不是排列组合。这是一个列表([True, False])与自身进行n次笛卡尔积的结果。 - Karl Knechtel
7个回答

28

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

8

如果您将值视为,那么这将相对容易。例如对于n = 3的情况,将其视为包含三个位的值。

使用整数循环(从02ⁿ - 1(含)),并打印每个值中的所有位(其中0False1True)。然后您将获得所有排列。

当然,这不是非常Pythonic的解决方案,但它是通用的。


哇,我甚至没有想过使用二进制。非常有趣。 - Anonymous
你赢了我 :D (不喜欢这个双关语?太糟糕了) - GeeTransit

3

尝试使用带有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]

2

如果你需要列表的列表,而不是元组的列表,请参考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]

感谢Kevin的帮助。

那不是最好的方式。 - U13-Forward
1
请分享更好的方法,我也很感兴趣。 - zabop
看看我的吧,而且它也更简单 :D - GeeTransit
1
我认为只需使用[list(elem) for elem in listTuples]即可适当地将其转换。 - Anonymous
2
@zabop 在我的回答中。 - U13-Forward
@KevinMoy 我同意你的观点。 - U13-Forward

1
这不是高效的解决方案,但您可以使用以下代码:

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

1

编辑:看起来在发布答案之前我没有检查输出。它将保持不变,因为正确的方法将是正确答案的重复。

使用这个简单的代码:

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

1
语法错误:在(True for _ in range(length),处。 - iz_
我已经修好了。哎呀,花了一点时间。 - GeeTransit
1
仍然是语法错误,缺少逗号。 - iz_
1
最后一行应为:[list(r) for r in result],否则会出现语法错误。 - zabop
1
“combinations”不是这个任务的正确工具。最好的方法是使用“product”,而不是生成过多的组合,然后使用“set”来修复问题,这种方法比较低效。 - user2357112
显示剩余3条评论

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接