python构建动态增长的真值表
我的问题很简单: “如何以优雅的方式在python中构建动态增长的真值表?” 对于n=3python构建动态增长的真值表,python,logic,truthtable,Python,Logic,Truthtable,我的问题很简单: “如何以优雅的方式在python中构建动态增长的真值表?” 对于n=3 for p in False, True: for q in False, True: for r in False, True: print '|{0} | {1} | {2} |'.format(int(p),int(q), int(r)) 对于n=4 for p in False, True: for q in False, True:
for p in False, True:
for q in False, True:
for r in False, True:
print '|{0} | {1} | {2} |'.format(int(p),int(q), int(r))
对于n=4
for p in False, True:
for q in False, True:
for r in False, True:
for s in False, True:
print '|{0} | {1} | {2} | {3}'.format(int(p),int(q), int(r), int(s))
我想有一个函数,以n为参数,并建立表,这是没有必要的
要打印表格,返回代表表格的数据结构也可以。使用:
n=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)]
请看一下模块
itertools
确实是大家都指出的方向。但是,如果您真的想了解实现此功能所需的算法的具体细节,您应该查找。以下是它在您的案例中的工作方式:
def tablize(n, truths=[]):
if not n:
print truths
else:
for i in [True, False]:
tablize(n-1, truths+[i])
测试,工作
希望这能有所帮助。当然,列表理解更像是python
def truthtable (n):
if n < 1:
return [[]]
subtable = truthtable(n-1)
return [ row + [v] for row in subtable for v in [0,1] ]
作为具有产量的生成器函数
:
def truthtable (n):
if n < 1:
yield []
return
subtable = truthtable(n-1)
for row in subtable:
for v in [0,1]:
yield row + [v]
返回表示表的数据结构是可以的
…在这种情况下,范围(2**n)
就是您所需要的。范围中的每个数字表示真值表中的一行。当且仅当表的k
th行中i
th变量为真时,数字k
的二进制表示形式的i
th位为1
如果需要实际表格,可以使用:
[ [ ((row >> bit_index) & 1) == 1 for bit_index in range(n)]
for bit_index in range(2 ** n) ]
这里有谁喜欢生的一行纸
>>> truthtable = lambda n: [[(v>>i)&1 for i in range(n-1,-1,-1)] for v in range(1<<n)] if n>0 else [[]]
>>truthtable=lambda n:[[(v>>i)&1表示范围内的i(n-1,-1,-1)]表示范围内的v(1简单数学:
a = lambda x: [x//4%2,x//2%2,x%2]
for i in range(8):
print(a(i))
[0, 0, 0]
[0, 0, 1]
[0, 1, 0]
[0, 1, 1]
[1, 0, 0]
[1, 0, 1]
[1, 1, 0]
[1, 1, 1]
编辑:
更通用的格式是:
def truth_table(n):
for i in range(2**n):
line = [i//2**j%2 for j in reversed(range(n))]
print(line)
这只会将结果打印为:
>>> truth_table(3)
[0, 0, 0]
[0, 0, 1]
[0, 1, 0]
[0, 1, 1]
[1, 0, 0]
[1, 0, 1]
[1, 1, 0]
[1, 1, 1]
这是一个使用函数式编程、不使用循环和不导入任何外部库的实现:
get_bits = lambda n: [*map(lambda x:[*map(int,bin(x)[2:].zfill(n))],range(2**n))]
然后调用get_bits
,获得所需数量的参数:
>>> get_bits(3)
[[0, 0, 0],
[0, 0, 1],
[0, 1, 0],
[0, 1, 1],
[1, 0, 0],
[1, 0, 1],
[1, 1, 0],
[1, 1, 1]]
请查看我的,看看我的从布尔表达式字符串生成真值表的充实项目。这确实是他们的方法。感谢所有人的回答。我会按照这里描述的方式来做,但下面的实现值得一看和投票!使用yield会是什么样子?我对python有点陌生。你能给我一些建议吗请给我一个使用yield?的版本,这对解决进一步的问题非常有帮助:)我非常喜欢scala中的yield;)提示:如果您想要类似yield的功能,只需替换所有括号(除其他括号外)使用括号,lambda函数将返回一个双生成器对象。这不是泛化,它只适用于n=3。现在,请尝试
def truth_table(n):
for i in range(2**n):
line = [i//2**j%2 for j in reversed(range(n))]
print(line)
>>> truth_table(3)
[0, 0, 0]
[0, 0, 1]
[0, 1, 0]
[0, 1, 1]
[1, 0, 0]
[1, 0, 1]
[1, 1, 0]
[1, 1, 1]
get_bits = lambda n: [*map(lambda x:[*map(int,bin(x)[2:].zfill(n))],range(2**n))]
>>> get_bits(3)
[[0, 0, 0],
[0, 0, 1],
[0, 1, 0],
[0, 1, 1],
[1, 0, 0],
[1, 0, 1],
[1, 1, 0],
[1, 1, 1]]