如何在python中迭代使用格式?

如何在python中迭代使用格式?,python,format,iteration,logic,sat,Python,Format,Iteration,Logic,Sat,我现在正在写一个程序,要求我有一个逻辑公式,然后在这个逻辑公式上尝试真与假的每一个组合。目前,我有一些代码创建了一个逻辑公式,它的形式是:({1}或不{2}或不{5})和(不{1}或{6})和(不{2}或不{3})和({3}或不{4})以及(不{4}或{5}或不{6}),其中数字需要为每一个真和假组合交换出来。我使用这一行计算出的真与假的组合combos=product([true,false],repeat=no_变量)。我目前有以下代码尝试执行此操作: for i in combos:

我现在正在写一个程序,要求我有一个逻辑公式,然后在这个逻辑公式上尝试真与假的每一个组合。目前,我有一些代码创建了一个逻辑公式,它的形式是:
({1}或不{2}或不{5})和(不{1}或{6})和(不{2}或不{3})和({3}或不{4})以及(不{4}或{5}或不{6})
,其中数字需要为每一个真和假组合交换出来。我使用这一行计算出的真与假的组合
combos=product([true,false],repeat=no_变量)
。我目前有以下代码尝试执行此操作:

for i in combos:
    for j in range (no_variables):
            k=j+1 //as the variables in the string do not start at 0
            print(formulastring.format(k = i[j]))
但是,它不工作并返回此错误:

print(formulastring.format(k = i[j]))
IndexError: Replacement index 1 out of range for positional args tuple


任何帮助都将不胜感激

问题是,您提供的格式字符串查找位置参数(
{0}
{1}
,等等),但您使用关键字参数调用格式函数(
k=…

您需要更改格式字符串以接受关键字参数,例如:
{k}
而不是
{0}

或者,更改传递参数的方式,将其命名为
.format(i[j],…)
。记住,格式字符串需要7个参数

演示:

# Positional
"{0} {1} {2}".format(3, 423, 12)
# Output: '3 423 12'

# Keyword
"{a} {b} {c}".format(a=3, b=423, c=12)
# Output: '3 423 12'

现在将此应用于您的问题:

formulastring = "({1} or not {2} or not {5} )and (not {1} or {6} )and (not {2} or not {3} )and ({3} or not {4} )and (not {4} or {5} or not {6} )"
no_variables = 7 # Judging from this particular formatstring

combos= product([True,False],repeat = no_variables)
# Each element of combos is a 7-element tuple

for values in combos:
    # values is a tuple containing no_variables booleans
    # *values unpacks the tuple and passes it as positional arguments to format()
    print(formulastring.format(*values))

这给出了您期望的输出。

公式字符串是什么样子的?代码上方的文本中显示了它。它是逻辑公式@RishabhKumarbut k,随着每次迭代从0变为6。整个代码适用于任何逻辑公式,因此我无法硬编码确切的变量数量,因为我添加到答案中的每个公式可能会发生变化。抓紧我不能使用positional,因为公式中重复了一些变量,我不能使用关键字,因为我不能硬编码以前的变量。您可以通过传递列表作为位置参数。我正在编辑我的答案以包含example@userj更新有帮助吗?测试中的f是什么意思?以及“results”是每个组合获得的全部真值赋值吗?它是一个f字符串,基本上python将计算{}括号中的任何值,所以在本例中,测试在这些点上只会得到一个1、2、3、etcc。您可以删除{}括号,字符串不会改变。对,结果中的每个组合都包含True或False。我修复了几个bug。现在该工作了!
import itertools

combos = list(itertools.product([False, True], repeat=6))

test = f'({1} or not {2} or not {5}) and (not {1} or {6})and (not {2} or not {3} )and ({3} or not {4} )and (not {4} or {5} or not {6} )'

results = []
for combo in combos:
    cur = test
    for idx, val in enumerate(combo):
        cur = cur.replace(str(idx+1), str(val))
        
    results.append(eval(cur))