python build a dynamic growing truth table python build a dynamic growing truth table python python

python build a dynamic growing truth table


Use itertools.product():

table = list(itertools.product([False, True], repeat=n))

Result for 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 really is the way to go as has been pointed out by everyone. But if you really want to see the nuts and bolts of the algorithm required for this, you should look up recursive descent. Here's how it would work in your case:

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

Tested, working

Hope this helps


List comprehensions are, of course, more Pythonic.

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

Results, indented for 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] ]

As a generator function with 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]

Also simply changing the return from an array comprehension to a generator expression makes the return type equivalent to the yield version's generator function:

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