生成真/假的所有长度-n 排列?

Posted

技术标签:

【中文标题】生成真/假的所有长度-n 排列?【英文标题】:Generate all length-n permutations of True/False? 【发布时间】:2019-01-06 08:40:31 【问题描述】:

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

如何生成一个包含所有长度为 n 的 True 和 False 排列的列表?换句话说,给定一个元素列表[True, False],我如何生成这些元素所有可能的长度-n 组合的所有排列?

例如:

n=2 length-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 的真/假列表的所有组合的排列。

【问题讨论】:

不清楚你在问什么...... @U9-Forward 抱歉,我不太擅长措辞。我添加了另一个示例。 itertools模块中还有其他功能。 你确定这是排列吗?排列是“可以对一组或一组事物进行排序或排列的几种可能方式中的每一种”。 [True, True, True] 不是 True 和 False 值的重新排列。 @KM142646 和 Zabop 我宁愿说“集合 True, False 的笛卡尔积,n 次与自身”,我同意请求的列表列表与集合 True, False 的排列集(排列集只有 2 个元素;True, False 和 False, True)。 【参考方案1】:

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

【讨论】:

【参考方案2】:

如果您将值视为 bits,则相对容易。就像n = 3 的情况一样,将其视为一个包含三位的值。

0 循环(使用整数)到2ⁿ - 1(包括)并打印每个值中的所有位(0False1True)。然后你将拥有所有排列。

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

【讨论】:

哇,甚至没有考虑过使用二进制文件。非常有趣。 你只有我一个 :D(不喜欢那个双关语?两个不好)【参考方案3】:

尝试 itertools.productrepeat 参数:

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]

【讨论】:

【参考方案4】:

如果您想要列表列表,而不是元组列表,请从 U9-Forward 的 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 将是列表的列表,而不是元组。


更好的方法,如下 cmets:

[list(elem) for elem in lll]

感谢Kevin。

【讨论】:

这不是最好的方法。 请分享一个更好的,我也有兴趣 那就看看我的吧。它也更简单:D 我认为 [list(elem) for elem in listTuples] 会适当地转换它 @zabop 在我的回答中。【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

使用这个简单的代码:

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

【讨论】:

(True for _ in range(length), 处的语法错误 我已经修好了。唷,这花了一点时间。 仍然语法错误,缺少逗号。 最后一行应该是:[list(r) for r in result],否则语法错误 combinations 是这个工作的错误工具。充其量,您可以获得过度生成组合并使用set 来修复问题的东西,与使用product 相比仍然非常低效。【参考方案7】:

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

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]

【讨论】:

以上是关于生成真/假的所有长度-n 排列?的主要内容,如果未能解决你的问题,请参考以下文章

从 n 个元素生成长度为 r 的组合而不重复或排列的函数的时间复杂度是多少?

找到所有可能的 N 长度字谜 - 快速替代

生成排列[重复]

从n个整数列表(可能长度不等)中进行所有可能的n个长度排列[重复]

对数据长度为n的数组内的数据进行全排列,c语言

生成所有长度为 n 且设置了 k 位的二进制字符串。(需要写在 C 上)