如何在python中计算数据行

如何在python中计算数据行,python,Python,我有一个文件(数据com 300行),其中包含描述一组值及其相关不确定性组合的表达式。比如: (18.13053098972887 +/- 0.9408208676613867) + (4.198532451786269 +/- 1.006181051488966) (11.64429613156244 +/- 0.8494858154859093) / (9.363430186640471 +/- 1.426559761587884) (8.380090296880461 +/- 0.7207

我有一个文件(数据com 300行),其中包含描述一组值及其相关不确定性组合的表达式。比如:

(18.13053098972887 +/- 0.9408208676613867) + (4.198532451786269 +/- 1.006181051488966)
(11.64429613156244 +/- 0.8494858154859093) / (9.363430186640471 +/- 1.426559761587884)
(8.380090296880461 +/- 0.7207204182841811) - (14.66227215207273 +/- 1.695262722671032) (14.89348010703303 +/- 0.5526766418243718) - (11.38945635408163 +/- 0.6236755388832851)
(7.799527276109394 +/- 0.2574050770442082) + (16.72086955979466 +/- 1.110203643562272)
(9.608384727728524 +/- 0.4631992350332439) + (10.37543680415251 +/- 1.163914272905167) (4.18157352367416 +/- 0.6524763186462224) / (10.3161260811612 +/- 1.110916984908603)  (3.776332299345897 +/- 1.075189965311438) - (11.53599019583698 +/- 0.7387217730283737) (14.93653570161044 +/- 1.60794403241016) / (11.83556322752483 +/- 0.466637508245185) 
(13.85353967547417 +/- 0.9246529699786543) / (14.20790420838551 +/- 0.3679686461109668) (20.63305806977545 +/- 1.545379194198176) * (10.95731035336255 +/- 1.434931108092665)  (20.80371993819163 +/- 1.273124703682392) + (15.93093231553212 +/- 0.5784831928649479)
(13.61241819963037 +/- 0.04285690967801981) - (7.682740816076352 +/- 0.4521933933719993)
每行包含一个表达式。表达式中每个术语的格式为(值+/-不确定性),包括括号。它们通过加法、减法、乘法和除法进行组合。通常的运算符优先级适用,即:除法和乘法优先于加法和减法。除包含单个表达式的括号外,不使用括号

我需要计算每个表达式,并将结果及其不确定性写入一个输出文件,每行一个结果。最后,计算所有表达式及其相关不确定性的总和


有人能帮我吗?

这里是一个起点:

from ply import lex
from ply import yacc

# lexer
tokens = ('OPEN_PAREN', 'NUMBER', 'CLOSE_PAREN', 'ADD', 'SUB', 'MUL', 'DIV')

t_OPEN_PAREN = r'\('
t_NUMBER = r'\d+\.\d+'
t_CLOSE_PAREN = r'\)'
t_ADD = r'\+'
t_SUB = r'-'
t_MUL = r'\*'
t_DIV = r'/'

t_ignore = ' \t'


# parser
def p_expression_add(p):
    'expression : expression ADD term'
    p[0] = ('+', p[1], p[3])


def p_expression_sub(p):
    'expression : expression SUB term'
    p[0] = ('-', p[1], p[3])


def p_expression_term(p):
    'expression : term'
    p[0] = p[1]


def p_term_mul(p):
    'term : term MUL factor'
    p[0] = ('*', p[1], p[3])


def p_term_div(p):
    'term : term DIV factor'
    p[0] = ('/', p[1], p[3])


def p_term_factor(p):
    'term : factor'
    p[0] = p[1]


def p_factor(p):
    'factor : OPEN_PAREN number ADD DIV SUB number CLOSE_PAREN'
    p[0] = (p[2], p[6])


def p_number(p):
    'number : NUMBER'
    p[0] = float(p[1])


# oh, and handle errors
def p_error(p):
    raise SyntaxError("Syntax error in input on line %d" % lex.lexer.lineno)


def parse(input):
    '''
    parses a string with the contents of the idf file and returns the dictionary
    representation.
    '''
    lexer = lex.lex(debug=True)
    lexer.input(input)
    parser = yacc.yacc()
    result = parser.parse(debug=True)
    return result

if __name__ == '__main__':
    #result = parse('(18.13053098972887 +/- 0.9408208676613867)')
    result = parse('(18.13053098972887 +/- 0.9408208676613867) + (4.198532451786269 +/- 1.006181051488966)')
    print result
此脚本将生成以下输出:(注意,我剥离了调试输出)

你的下一步将是:

  • 扩展解析器以处理每行多个表达式
    • 您可能想比在您的问题中更好地定义语义
  • 检查结果并解释它
    • 增加不确定性如何影响结果
您还可以使用解析器进行计算,例如,如果添加不确定数字与添加其值和不确定度相同:

def p_expression_add(p):
    'expression : expression ADD term'
    p[0] = (p[1][0] + p[3][0], p[1][1] + p[3][1])
如果这样替换
p\u表达式\u add
,则生成的答案将是:

(22.32906344151514, 1.9470019191503527)

玩得开心!像这样的简单解析是一个非常有用的工具,您可以使用它,因为许多棘手的问题在被视为解析问题时变得更加容易。

我知道eval很糟糕,但您可以尝试ast.literal\u eval()。Ast literal eval仅适用于较小的python命令


您可能需要将字符串转换为浮点数。

有些行似乎有多个表达式;这可能是一个复制粘贴错误吗?您尝试过什么吗?这不是一个错误,它们在大部分行中的表达式数量确实不同。我想您必须实现自己的解析器(您将定义+/-和其他运算符如何相互作用)。一点也不容易。看看。你能解释一下合成不确定性的算法吗?
(22.32906344151514, 1.9470019191503527)
import ast

for line in file:
    value = ast.literal_eval(line)