python构建动态增长的真值表

python构建动态增长的真值表,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:

我的问题很简单: “如何以优雅的方式在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 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]]