Python使用递归采取混合字符串,并将字符串中的整数加起来
我想使用递归采取混合字符串并在整数上添加值。一个例子输入是“ab4h5h6”和放出来会是15Python使用递归采取混合字符串,并将字符串中的整数加起来
这里是我到目前为止的代码
def toNumber(s):
total = 0
if len(s) == 0:
return 0
else:
first = s[0]
rest = s[1:]
num_rest = toNumber(s[1:])
if first.isdigit()== True:
return int(first) + total
else:
if rest.isdigit()== True:
return int(rest) + int(num_rest)
我已经尝试了很多不同的东西,但我似乎无法得到所期望的结果。
如果rest
是数字,则不需要关心;只需添加的first
值(即0,如果不是一个数字),加上递归结果:
def toNumber(s):
if not s:
return 0
first = s[0]
value = int(first) if first.isdigit() else 0
return value + toNumber(s[1:])
其他说明:
- 空字符串 'falsey';所以
not s
只有在字符串为空时才为真。因此可以将len(s) == 0
简化为not s
。 - 在布尔测试中没有必要使用
== True
,这就是if
已经为您做的。
演示:
>>> def toNumber(s):
... if not s:
... return 0
... first = s[0]
... value = int(first) if first.isdigit() else 0
... return value + toNumber(s[1:])
...
>>> toNumber('ab4h5h6')
15
谢谢,那工作完美。我正在考虑这个问题。 – MDiG
你过于复杂的事情。递归应该总是返回当前字符的数量值加上函数的结果呼吁字符串的其余部分:
def toNumber(s):
if len(s) == 0:
return 0
first = s[0]
rest = s[1:]
numFirst = 0
if first.isdigit():
numFirst = int(first)
return num_first + toNumber(rest)
非常最短:
toNumber = lambda s: bool(s) and ((s[0].isdigit() and int(s[0])) + toNumber(s[1:]))
如果您不需要递归:
toNumber = lambda s: sum(int(i) for i in s if i.isdigit())
甚至一个字符短,虽然莱小号Python的:
toNumber = lambda s: sum(map(int,filter(str.isdigit,s))))
这里是另一种解决方案。
策略:不顾一切地对待每一个数字作为一个int和捕获异常
def toNumber(s):
if len(s) == 0:
return 0
try:
return int(s[:1]) + toNumber(s[1:])
except ValueError:
return toNumber(s[1:])
而这里采用了同样的策略非递归版本
def toNumberNonRecursive(s):
total = 0
for c in s:
try:
total += int(c)
except ValueError:
# not an int
pass
return total
输出:
>>> print(toNumber('1a2b3c'))
6
>>> print(toNumber(''))
0
>>> print(toNumber('abc'))
0
>>> print(toNumber('w48957jmc98(&H(*&398cmdi98'))
87
请不要在你的代码中使用== True。 – Brian