python构建一个动态增长的真值表

evi*_*ead 17 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))
Run Code Online (Sandbox Code Playgroud)

对于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))
Run Code Online (Sandbox Code Playgroud)

我想有一个函数,它将n作为参数并构建表,没有必要打印表,返回表示表的数据结构也很好.

Sve*_*ach 37

用途itertools.product():

table = list(itertools.product([False, True], repeat=n))
Run Code Online (Sandbox Code Playgroud)

结果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)]
Run Code Online (Sandbox Code Playgroud)

  • 这很漂亮. (4认同)

ins*_*get 5

itertools正如大家所指出的那样,真的是要走的路.但是如果你真的想看到这个算法所需的细节,你应该查找递归下降.以下是它在您的情况下的工作方式:

def tablize(n, truths=[]):
    if not n:
        print truths
    else:
        for i in [True, False]:
            tablize(n-1, truths+[i])
Run Code Online (Sandbox Code Playgroud)

经过测试,工作

希望这可以帮助


Gle*_*oss 5

列表理解当然更像是Pythonic.

def truthtable (n):
  if n < 1:
    return [[]]
  subtable = truthtable(n-1)
  return [ row + [v] for row in subtable for v in [0,1] ]
Run Code Online (Sandbox Code Playgroud)

结果,缩写为clairity:

truthtable(1)
[ [0],
  [1] ]

truthtable(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] ]
Run Code Online (Sandbox Code Playgroud)

作为生成器功能yield:

def truthtable (n): 
  if n < 1:
    yield []
    return
  subtable = truthtable(n-1)
  for row in subtable:
    for v in [0,1]:
      yield row + [v]
Run Code Online (Sandbox Code Playgroud)

另外,简单地将返回值从数组解析更改为生成器表达式,使得返回类型等同于yield版本的生成器函数:

def truthtable (n):
  if n < 1:
    return [[]]
  subtable = truthtable(n-1)
  return ( row + [v] for row in subtable for v in [0,1] )
Run Code Online (Sandbox Code Playgroud)