Python中算术运算的函数分布

时间:2013-06-21 17:38:33

标签: python

假设我有一个映射,map,它将各种字符串与数值相关联:

{['a', 1],['b', 2], ['c',5]}

我想定义一个操作op,它将分配算术运算。所以我希望op的功能如下:

op('a+b') = 3

op('b') = 2

op('a*b+c') = 7 

我能想到的唯一方法就是解析字符串,记住操作,进行映射,然后进行操作。看起来很昂贵/很长,我希望有一个内置操作的更优雅的解决方案。

编辑:

我意识到我的措辞方式对我的问题并不安静,映射不是在我的系统上定义的,因此我无法定义所有可能的映射。我必须查询外部源的映射。

4 个答案:

答案 0 :(得分:1)

'不确定您是否考虑过但Python允许您override operators。如果不希望解析字符串,您可以创建一个包装类并定义相关的运算符以从“映射”中提取值。在这里,我使用字典,我只定义了“添加”:

class V:
    values = { 'a': 1, 'b': 2, 'c': 3 }

    def __init__(self, name):
        self.name = name

    def __add__(self, other):
        return V.values[self.name] + V.values[other.name]

a = V('a')
b = V('b')

print a+b
# display 3

如果您使用字符串,甚至可以eval这样的表达式(即使 eval 从安全角度来看不是您最好的朋友 - 您也不应该直接 eval 来自不受信任来源的表达式):

print eval("a+b")
# display 3

答案 1 :(得分:0)

def op(eqn_str,**vars):
    for var,val in vars.items():
        eqn_str = eqn_str.replace(var,str(val))
    return eval(eqn_str)

op('a+b',a=5,b=3)
op('a+b',**{'a':5,'b':3})
my_vars = {'a':5,'b':3}
op('a+b',**my_vars)

或稍微有点

def op(eqn_str,**vars):
    eqn_str = re.sub('(a-z)','%(\\1)s',eqn_str)
    eqn_str = eqn_str.format(vars)
    return eval(eqn_str)
#called same way as above

这样的事可能......虽然eval总是有点粗略

我真的是第二个Jon的评论,你应该看一下同情

找出你需要的钥匙

needed_keys = [letter for letter in str_eqn if letter.isalpha()]

答案 2 :(得分:0)

好吧,除非你想要重新发明同情(参见评论),你要做的就是解析你的字符串中的数据,创建一个抽象语法树,获取符号并将其转换为python对象。这样你甚至可以尊重运营商的优先权,你不会使用EVAL

我最好的建议是看看这个70 lines gist,它展示了如何实现一个简单的计算器(不知怎的,你想要什么)。您只需要将您的值与字符串中的值匹配。

与我所说的精神相同,@ JFSebastian将post联系起来甚至更好。

答案 3 :(得分:0)

这是一个单行:

>>> eval('b', dict([['a', 1],['b', 2], ['c',5]]))
2
>>> eval('a+b', dict([['a', 1],['b', 2], ['c',5]]))
3
>>> eval('a*b+c', dict([['a', 1],['b', 2], ['c',5]]))
7