expr='9subtract5equal4'
expr = expr.replace('subtract', '-')
expr = expr.replace('plus', '+')
expr = expr.replace('equal', '==')
我觉得最后三行代码非常难看,所以我尝试使用map
和其他函数编程函数进行优化。但我没有找到实现这一目标的好方法。有什么建议吗?
答案 0 :(得分:5)
你可以这样做:
def replace_all(text, dic):
for i, j in dic.items():
text = text.replace(i, j)
return text
s = '9subtract5equal4'
d = {
'subtract': '-',
'plus': '+',
'equal': '==',
}
s = replace_all(s, d)
答案 1 :(得分:2)
因为代码很好但你可以直接在每一步的返回值上操作:
expr='9subtract5equal4'
expr = expr.replace('subtract', '-') \
.replace('plus', '+') \
.replace('equal', '==')
甚至
expr = '9subtract5equal4' \
.replace('subtract', '-') \
.replace('plus', '+') \
.replace('equal', '==')
答案 2 :(得分:2)
创建一个从操作数名称映射到符号的字典:
ops = {'subtract':'-', 'add':'+', 'equal':'=='}
您可以根据需要制作它,这显然是一种优化 - 添加更多操作数非常简单,无需进一步修改。
使用列表解析遍历表达式:
[x if x.isdigit() else ops[x] for x in re.findall(r'\d+|[a-z]+',expr)]
这使用正则表达式来分隔数字和操作数,所以import re
在开始时。正则表达式返回
['9', 'subtract', '5', 'equal', '4']
并且列表理解用字典中的项目替换非数字字符串。
结果:
['9', '-', '5', '==', '4']
所以你要使用
expr = ''.join([x if x.isdigit() else ops[x] for x in re.findall(r'\d+|[a-z]+',expr)])
获取输出
'9-5==4'
答案 3 :(得分:1)
你可以这样做:
expr = expr.replace('subtract', '-').replace('plus', '+').replace('equal', '==')
或者,您可以循环使用dict
替代品:
replace = {'subtract': '-', 'plus': '+', 'equal': '='}
for word in replace:
expr = expr.replace(word, replace[word])
答案 4 :(得分:1)
老实说,我会按照您编写的方式编写它,但如果您想“功能性地”执行此操作,您可能需要使用functools.reduce
,因为您需要将一个替换列表“减少”为一个结果:
import functools
expr = '9subtract5equal4'
# a list of our replacements, as pairs
REPLACEMENTS = [
('subtract', '-'),
('plus', '+'),
('equal', '=='),
]
result = functools.reduce(
lambda word, old_new: word.replace(old_new[0], old_new[1]),
REPLACEMENTS,
expr
)
这里我们只是“累积”lambda函数的结果,它取最后一个“累积”单词和一个替换对,并调用.replace()
来获得下一个“累积”单词。
但实际上这不是解决这个问题的Pythonic方法(有一个原因导致{3}在{3}}中被reduce
推入,并且你的原始方法更好。