假设我有一个映射,map,它将各种字符串与数值相关联:
{['a', 1],['b', 2], ['c',5]}
我想定义一个操作op
,它将分配算术运算。所以我希望op的功能如下:
op('a+b') = 3
op('b') = 2
op('a*b+c') = 7
等
我能想到的唯一方法就是解析字符串,记住操作,进行映射,然后进行操作。看起来很昂贵/很长,我希望有一个内置操作的更优雅的解决方案。
编辑:
我意识到我的措辞方式对我的问题并不安静,映射不是在我的系统上定义的,因此我无法定义所有可能的映射。我必须查询外部源的映射。
答案 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