You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含英文数字与加减符号的字符串求和算法优化求助

问题描述

给定字符串:

s = 'one+one-two-one+two'

需要计算该字符串对应的数值总和(one对应1,two对应2)。原代码在处理类似'one+-one-two-one+two'的字符串时无法正常工作,求优化方案。

原尝试代码:

s = 'one+one-two-one+two'
d = {'one': 1, 'two': 2}
add = s.split('+')
result = 0
for i in range(len(add)):
    val = d.get(add[i], None)
    if val:
        result += val
    else:
        sub = add[i].split('-')
        for j in range(len(sub)):
            if j > 0:
                result -= d[sub[j]]
            else:
                result += d[sub[j]]
print(result)
问题分析

原代码通过+分割字符串的方式存在缺陷:当出现+-组合时,分割后会得到空字符串或者以-开头的片段(比如'one+-one'按+分割后得到['one', '-one']),此时d.get('-one')无法匹配字典中的键,导致报错或计算错误。

优化方案

使用正则表达式提取所有带符号的单词(包括开头无符号默认正的情况),统一处理所有正负号组合:

import re

s = 'one+-one-two-one+two'
d = {'one': 1, 'two': 2}
# 匹配所有带正负号或无符号的目标单词
matches = re.findall(r'([+-]?)(one|two)', s)
result = 0
for sign, word in matches:
    num = d[word]
    if sign == '-':
        result -= num
    else:
        # 空符号或+号统一做加法
        result += num
print(result)

代码说明

  • re.findall(r'([+-]?)(one|two)', s):正则表达式会捕获两部分内容,第一部分是可选的正负号([+-]?表示0或1个正负号),第二部分是目标单词one或two,能覆盖所有符号组合场景。
  • 遍历匹配结果时,根据符号对对应数值进行加减操作,彻底解决+-这类特殊符号组合的解析问题。

也可以用更简洁的写法:

import re

s = 'one+-one-two-one+two'
d = {'one': 1, 'two': 2}
matches = re.findall(r'([+-]?)(one|two)', s)
result = sum(d[word] * (-1 if sign == '-' else 1) for sign, word in matches)
print(result)

内容的提问来源于stack exchange,提问作者falukky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:24:58