1

所以这是一个我似乎很困惑的简单问题,我一直在研究这个输入问题,并试图将用户输入的某些部分存储到分段列表中。

用户输入将输入一个 CNF(连接范式)。示例:+ = or, * = and, ( and ) 中的任何内容都是子句

(A+B)*(C+D)

因此,由于此输入有两个子句,我需要将每个子句作为它们自己的项目存储到列表中。我无法弄清楚如何遍历我已经制作的列表并让我的 if 语句对每个子句进行分段,我从逻辑上理解它应该如何工作,我只需要与将某些内容动态存储到列表。

我全心全意地理解为什么索引不起作用,我基本上是在寻找索引方法的反面,我需要找到与我的索引关联的项目。

例如,当我找到一个开放的括号“(”时,我需要开始将一个新子句存储到我的列表中,到目前为止我只找到了如何返回索引本身而不是通过索引返回项目。这应该是一个简单的解决方案对此,但我根本找不到与明智地显示此方法相关的任何内容。

cnf = input("CNF: ")
cnf_input = list(cnf)

cnf_input_len = len(cnf_input)
i = 0
##this count resets when it sees a ")"
claus_count = 0
while i < cnf_input_len:

    claus_list = cnf_input.append(i)
    print(cnf_input.index("B"))
    if cnf_input.index(i)=="(":
        print('Cut here')
    i=i+1

我的代码作为指导

4

2 回答 2

2

看来你把它复杂化了。只需使用str.split后跟str.strip即可获取列表中的各个子句

>>> [elem.strip('()') for elem in "(A+B)*(C+D)".split("*")]
['A+B', 'C+D']

您甚至可以扩展它以获取子句的单个文字作为元组或列表以获取列表列表

>>> [elem.strip('()').split('+') for elem in "(A+B)*(C+D)".split("*")]
[['A', 'B'], ['C', 'D']]

您甚至可能想尝试使用正则表达式

>>> re.findall(r'([^()]+?)\+([^()]+?)', "(A+B)*(C+D)")
[('A', 'B'), ('C', 'D')]
于 2015-03-12T18:25:14.530 回答
1

您可以使用正则表达式来确定公式中的起点/终点。

import re

formula = r'\(([\w+\d+])([*+-/])([\w+\d+])\)([*+-/])\(([\w+\d+])([*+-/])([\w+\d+])\)'
solve_for = '(A+B)*(C+D)'
splitter = re.match(formula, solve_for).groups()

splitter 现在是用户输入的元组:

('A', '+', 'B', '*', 'C', '+', 'D')
于 2015-03-12T18:27:55.617 回答