如何在python中计算数据行

2024-09-27 23:24:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

每行包含一个表达式。表达式中每个术语的格式为(值+/-不确定性),包括括号。它们通过加法、减法、乘法和除法相结合。通常的运算符优先适用,即:除法和乘法优先于加法和减法。除包含单个表达式的括号外,不使用其他括号。你知道吗

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

有人能帮我吗?你知道吗


Tags: 文件表达式格式运算符括号术语不确定性乘法
2条回答

我知道评估很糟糕,但你可以试试评估(). Ast literal eval只适用于较小的python命令。Using python's eval() vs. ast.literal_eval()?

import ast

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

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

这是一个起点:

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

这个脚本将产生以下输出:(注意,我剥离了调试输出)

('+', (18.13053098972887, 0.9408208676613867), (4.198532451786269, 1.006181051488966))

接下来的步骤是:

  • 扩展解析器以每行处理多个表达式
    • 您可能希望定义语义比在您的问题中更好一点
  • 检查结果并解释
    • 增加不确定性如何影响结果?你知道吗

您还可以使用解析器来进行计算,例如,如果添加不确定的数字与添加它们的值和不确定度是相同的:

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

如果您这样替换p_expression_add,那么生成的答案将是:

(22.32906344151514, 1.9470019191503527)

玩得开心!像这样简单的解析是一个非常有用的工具,您可以随意使用,因为很多棘手的问题在被看作解析问题时会变得更容易。你知道吗

相关问题 更多 >

    热门问题