真相表清单

时间:2019-07-17 14:49:36

标签: python list truthtable

我的目标是在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]

1 个答案:

答案 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)]

(请注意,这里的行和列是相反的,但这样可能更有意义。)