生成真/假的所有长度-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
(包括)并打印每个值中的所有位(0
是False
和1
是True
)。然后你将拥有所有排列。
当然,这不是一个非常 Pythonic 的解决方案,但它是通用的。
【讨论】:
哇,甚至没有考虑过使用二进制文件。非常有趣。 你只有我一个 :D(不喜欢那个双关语?两个不好)【参考方案3】:尝试 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]
【讨论】:
【参考方案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 的组合而不重复或排列的函数的时间复杂度是多少?