真相table列表

Truth table list

我的目标是在 python 中实现 table,这是我的代码:

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]

假设您只想创建一个 "truth table",第一行有 1/2 True 个值,第二行有 2x 1/4 True 个值,依此类推,这样 table 中的列将成为具有该参数数量的真值函数的输入。 您不能只使用任何 j 作为何时将 False 放入 table 的截止点,因为该模式是周期性的。相反,您可以尝试将当前 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)]

(请注意,行和列在这里颠倒了,但这样可能更有意义。)