我的目标是在python中创建一个真值表,这是我的代码:
from re import findall
string = "xyz"
def getChars(str):
listChars = findall(r"\w", str)
return listChars
def createCharsTruthTable(lst):
n = 2 ** len(lst)
boolList = [[True for x in range(n)] for j in range(len(lst))]
num_of_T = n / 2
for i in range(len(boolList)):
for j in range(len(boolList[i])):
if j >= num_of_T:
boolList[i][j] = False
num_of_T /= 2
return boolList
createCharsTruthTable(getChars(string))
问题是输出是...
[[True, True, True, True, False, False, False, False], [True, True, False, False, False, False, False, False], [True, False, False, False, False, False, False, False]]
第一个列表正确了。我唯一的问题是后续列表,第二个列表中是...
[True, True, False, False, False, False, False, False]
我的问题是如何将其变成...
[True, True, False, False, True, True, False, False]
答案 0 :(得分:0)
假设您只想创建一个“真值表”,第一行的数值为1/2 True
,第二行的数值为2x 1/4 True
,依此类推,这样该表中的列将是具有该数量参数的真函数的输入。
您不能仅使用任何j
作为何时将False
放入表的截止日期,因为该模式是周期性的。相反,您可以尝试将当前j
除以2的幂并测试它是偶数还是奇数:
cols = 3
rows = 2**cols
boolList = [[True for x in range(rows)] for j in range(cols)]
for i in range(cols):
for j in range(rows):
if (j // (2**(cols-1-i))) % 2 == 1:
boolList[i][j] = False
boolList
的结果:
[[True, True, True, True, False, False, False, False],
[True, True, False, False, True, True, False, False],
[True, False, True, False, True, False, True, False]]
更好的方法可能是改用itertools.product
:
>>> import itertools
>>> list(itertools.product([True, False], repeat=3))
[(True, True, True),
(True, True, False),
(True, False, True),
(True, False, False),
(False, True, True),
(False, True, False),
(False, False, True),
(False, False, False)]
(请注意,这里的行和列是相反的,但这样可能更有意义。)