因此,我试图将以列表形式显示的反向波兰语数学表达式转换为公式。我正在尝试通过将表达式拆分成较小的和然后将它们组合
来做到这一点这是我到目前为止的代码
SPARK_DIST_CLASSPATH
,但输出为:
import re
expression = [15, 7, 1, 1, '+', '-', '/', 3, '*', 2, 1, 1, '+', '+', '-']
polish_expression = " ".join([str(i) for i in expression])
numbers = re.split ("(\D\s)",polish_expression)
print(numbers)
我可以使用正则表达式(类似于)吗?
['15 7 1 1 ', '+ ', '', '- ', '', '/ ', '3 ', '* ', '2 1 1 ', '+ ', '', '+ ', '-']
编辑:
[[15,7,1,1],["+","-","/"],[3],["*"],[2,1,1],["+","+","-"]]
渐近,但所有数字都显示为单个字符串
import re
expression = [15, 7, 1, 1, '+', '-', '/', 3, '*', 2, 1, 1, '+', '+', '-']
polish_expression = "".join([str(i) for i in expression])
numbers = filter(None, re.split ("(\d+)",polish_expression))
print(list(numbers))
答案 0 :(得分:1)
使用正则表达式,以下代码可以产生所需的结果
polish_expression = ' '.join(map(str, expression))
split_output = re.split(r'((?:\d+ )+)', polish_expression)
# ['', '15 7 1 1 ', '+ - / ', '3 ', '* ', '2 1 1 ', '+ + -']
stripped_output = [s.strip() for s in split_output if s]
# ['15 7 1 1', '+ - /', '3', '*', '2 1 1', '+ + -']
string_list_output = [s.split(' ') for s in stripped_output]
# [['15', '7', '1', '1'], ['+', '-', '/'], ['3'], ['*'], ['2', '1', '1'], ['+', '+', '-']]
desired_output = [list(map(int, item)) if item[0].isdigit() else item for item in string_op]
# [[15, 7, 1, 1], ['+', '-', '/'], [3], ['*'], [2, 1, 1], ['+', '+', '-']]
一个简单的非正则表达式解决方案是:
如果您的expression
列表是问题中给出的str
和int
类型的混合,则可以使用以下代码:
output = [[expression[0]]]
for item in expression[1:]:
if type(item) == type(output[op_index][0]):
output[op_index].append(item)
else:
output.append([item])
op_index += 1
print(output)
# [[15, 7, 1, 1], ['+', '-', '/'], [3], ['*'], [2, 1, 1], ['+', '+', '-']]
如果它们都是str
,那么您应该可以使用str.isdigit()
进行区分。