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