verdad una tablas tabla programacion not hacer como and python logic truthtable

python - una - tablas de verdad javascript



Python construir una tabla de verdad creciente dinĂ¡mica (6)

está bien devolver una estructura de datos que representa la tabla

... en ese caso el range(2 ** n) es todo lo que necesita. Cada número en el rango representa una fila en la tabla de verdad. El bit i th de la representación binaria del número k es 1 si, y solo si, la variable i th es verdadera en la fila k th de la tabla.

Si quieres una tabla real puedes usar:

[ [ ((row >> bit_index) & 1) == 1 for bit_index in range(n)] for bit_index in range(2 ** n) ]

Mi pregunta es simple: "¿cómo construir una tabla de verdad de crecimiento dinámico en python de una manera elegante?"

para 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))

para 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))

Me gustaría tener una función que tome n como parámetro y construya la tabla, no es necesario imprimir la tabla, devolver una estructura de datos que represente la tabla también está bien.


¿A quién aquí le gustan las lineas crudas?

>>> truthtable = lambda n: [[(v>>i)&1 for i in range(n-1,-1,-1)] for v in range(1<<n)] if n>0 else [[]]

100% probado y funcionando.
(No se puede copiar / pegar el resultado, o código anterior, porque estoy en un teléfono por Internet)


Echa un vistazo al módulo de itertools

In [7]: [i for i in itertools.product([0,1], repeat=3)] Out[7]: [(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]


Las comprensiones de la lista son, por supuesto, más Pythonic.

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

Resultados, con sangría para la claridad:

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] ]

Como función generadora con 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]

Además, simplemente cambiando el retorno de una comprensión de matriz a una expresión de generador, el tipo de retorno es equivalente a la función del generador de la versión de yield :

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


Utilice itertools.product() :

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

Resultado para 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 realmente es el camino a seguir como ha sido señalado por todos. Pero si realmente desea ver las tuercas y los pernos del algoritmo requerido para esto, debe buscar un descenso recursivo . Así es como funcionaría en tu caso:

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

Probado, trabajando

Espero que esto ayude