将字符串分成几个列表

时间:2019-05-26 11:24:31

标签: python-3.x

因此,我试图将以列表形式显示的反向波兰语数学表达式转换为公式。我正在尝试通过将表达式拆分成较小的和然后将它们组合

来做到这一点

这是我到目前为止的代码

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))

1 个答案:

答案 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列表是问题中给出的strint类型的混合,则可以使用以下代码:

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()进行区分。