如何优化三个连续的str.replace()调用?

时间:2018-04-29 14:22:32

标签: python replace

expr='9subtract5equal4'

expr = expr.replace('subtract', '-')
expr = expr.replace('plus', '+')
expr = expr.replace('equal', '==')

我觉得最后三行代码非常难看,所以我尝试使用map和其他函数编程函数进行优化。但我没有找到实现这一目标的好方法。有什么建议吗?

5 个答案:

答案 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)

  1. 创建一个从操作数名称映射到符号的字典:

    ops = {'subtract':'-', 'add':'+', 'equal':'=='}
    

    您可以根据需要制作它,这显然是一种优化 - 添加更多操作数非常简单,无需进一步修改。

  2. 使用列表解析遍历表达式:

    [x if x.isdigit() else ops[x] for x in re.findall(r'\d+|[a-z]+',expr)]
    

    这使用正则表达式来分隔数字和操作数,所以import re在开始时。正则表达式返回

    ['9', 'subtract', '5', 'equal', '4']
    

    并且列表理解用字典中的项目替换非数字字符串。

  3. 结果:

    ['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推入,并且你的原始方法更好。