2015-10-18 76 views
1

我想使用递归采取混合字符串并在整数上添加值。一个例子输入是“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) 

我已经尝试了很多不同的东西,但我似乎无法得到所期望的结果。

+0

请不要在你的代码中使用== True。 – Brian

回答

2

如果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 
+0

谢谢,那工作完美。我正在考虑这个问题。 – MDiG

0

你过于复杂的事情。递归应该总是返回当前字符的数量值加上函数的结果呼吁字符串的其余部分:

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) 
1

非常最短:

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

+1

恕我直言,迄今为止这里最好的答案。顺便说一句,使用'map'和'filter'不仅是Pythonic,它还是(在Python 2中)通过创建两个不必要的列表来浪费内存。 – Pierre

+0

非常感谢!我应该更多地解释我的代码,但是我不喜欢,因为它会迫使人们做一些研究:( 是的,允许体面的函数式编程实际上是Python 3的改进之一! – Labo

0

这里是另一种解决方案。

策略:不顾一切地对待每一个数字作为一个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