gpt4 book ai didi

类似于 Python 电子表格的公式解析器?

转载 作者:行者123 更新时间:2023-12-04 20:19:56 31 4
gpt4 key购买 nike

我有一个字典列表,例如:

l =[{country:'Italy',sales:100,cost:50}{country:'Italy',sales:130,cost:60}      
{country:'Germany',sales:110,cost:50}]

我想要一个 python 函数,它接受类似电子表格的输入 字符串 (请阅读下面@lott 的评论)公式如下:
margin = (sales-cost)/sales

它给了我返回:
l = [{country:'Italy',sales:100,cost:50,margin:1} ...]

你知道任何现有的图书馆这样做吗?或者你知道如何实现它?

我已经有了一个想法,如下所示,但我想要一种更好的方法来解析公式。处理“()”或类似内容中的 block 的东西。
parsed_op = {'sales':1,'cost':-1}
calc_field_name = 'smi'
counter = -1
for d in data:
counter = counter + 1
calc = sum([float(d[item])*parsed_op[item] for item in parsed_op])
d[calc_field_name] = calc
del data[counter]
data.append(d)

最佳答案

在我看来,真正的问题是将数字放在有单词的地方。

一种方法是使用 re.sub() 和一些字典格式(我真的不知道他们的真名,但是 here 有一些例子)。

编码:

import re

dct = {'country': 'Italy', 'sales': 100, 'cost': 50}
formula = 'margin = (sales-cost)/sales'

res_name,operation = formula.split('=')
num_formula = re.sub(r'([a-zA-Z]+)', r'{d[\1]}', operation.strip()).format(d=dct)
num_formula # '(100-50)/100'

dct[res_name.strip()] = eval(num_formula.format(d=dct))

结果:
{'country': 'Italy', 'cost': 50, 'margin': 0.5, 'sales': 100}

我用了 eval()评估字符串中的数值运算。通常使用 eval()是一种不好的做法,但这里非常方便。

无论如何,我相信你可以替换 eval()用别的东西评价。

快速解释

什么 re.sub()做:
>>> re.sub(r'([a-zA-Z]+)', r'{d[\1]}', '(sales-cost)/sales')
'({d[sales]}-{d[cost]})/{d[sales]}'
  • r'([a-zA-Z]+)'是模式。
  • [a-zA-Z]匹配任何字母字符。
  • +在告诉我们匹配一个或多个字母字符之后,在我们的例子中,toghter。
  • 括号用于分组。这意味着里面的东西将是一个组。因为我们只有一对括号,它将成为第 1 组。
  • r'{d[\1]}'是替换。
  • \1代表“将组号 1 放在那里”。
  • 所以基本上是要包装与 {d[ 匹配的内容。 ]} .

  • 要了解有关 re 模块的更多信息,请查看 official doc .

    格式化的工作原理:
    >>> '{d[first]} + {d[second]}'.format(d=dct)
    '1 + 2'

    将这两件事与一些 strip() 放在一起到处都有干净的字符串,你最终会得到上面的代码。

    关于类似于 Python 电子表格的公式解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9436959/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com