Python 列出索引并返回项目
Python List Indexing and Returning the Item
所以这是一个我似乎感到困惑的简单问题,我一直在研究这个输入问题并尝试将用户输入的某些部分存储到分段列表中。
用户输入将输入 CNF(合取范式)。
示例:+ = or, * = and, ( and ) 中的任何内容都是子句
(A+B)*(C+D)
因此,由于此输入有两个子句,我需要将每个子句作为它们自己的项目存储到列表中。我无法弄清楚如何遍历我已经制作的列表并让我的 if 语句对每个子句进行分段,我从逻辑上理解它应该如何工作,我只需要有关将某些内容动态存储到列表。
我完全理解为什么索引不起作用,我基本上是在寻找索引方法的反面,我需要找到与我的索引关联的项目。
例如,当我找到一个开放的括号“(”时,我需要开始将一个新子句存储到我的列表中,到目前为止我只找到了如何 return 索引本身而不是项目通过索引。这应该是一个简单的解决方案,但我根本找不到与显示此方法相关的任何内容。
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
我的代码作为指南
看来你把它复杂化了。只需使用 str.split followed by 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')]
您可以使用正则表达式来确定公式中的 starting/stopping 个点。
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')
所以这是一个我似乎感到困惑的简单问题,我一直在研究这个输入问题并尝试将用户输入的某些部分存储到分段列表中。
用户输入将输入 CNF(合取范式)。 示例:+ = or, * = and, ( and ) 中的任何内容都是子句
(A+B)*(C+D)
因此,由于此输入有两个子句,我需要将每个子句作为它们自己的项目存储到列表中。我无法弄清楚如何遍历我已经制作的列表并让我的 if 语句对每个子句进行分段,我从逻辑上理解它应该如何工作,我只需要有关将某些内容动态存储到列表。
我完全理解为什么索引不起作用,我基本上是在寻找索引方法的反面,我需要找到与我的索引关联的项目。
例如,当我找到一个开放的括号“(”时,我需要开始将一个新子句存储到我的列表中,到目前为止我只找到了如何 return 索引本身而不是项目通过索引。这应该是一个简单的解决方案,但我根本找不到与显示此方法相关的任何内容。
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
我的代码作为指南
看来你把它复杂化了。只需使用 str.split followed by 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')]
您可以使用正则表达式来确定公式中的 starting/stopping 个点。
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')