【问题标题】:Python List Indexing and Returning the ItemPython列表索引和返回项目
【发布时间】:2015-05-15 01:22:49
【问题描述】:

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

用户输入将输入一个 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

我的代码作为指导

【问题讨论】:

  • 你总是期待两个子句吗?还是可以是任意数量的子句?
  • 就像我说的,它是动态的,所以我需要根据用户输入的内容进行相应的分配。他们只能输入 26 个文字(变量:A、B、C...)作为输入,但子句可以任意多。我存储的是什么运算符? "=="?

标签: python list methods cnf


【解决方案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()

现在拆分器是用户输入的元组:

('A', '+', 'B', '*', 'C', '+', 'D')

【讨论】:

    【解决方案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')]
    

    【讨论】:

    • 为了扩展这一点,这可以用字典翻译吗,我需要我使用的文字的每个值都是 1 或 0(1 为真,0 为假) .我需要以这种方式设置我的输入,以检查每个文字需要是什么才能使整个 CNF 为真,并且我这样做是为了使每个子句至少有一个 1(这使得子句本身为真)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2014-10-12
    • 2023-04-10
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多