实现一个函数,该函数对Python中字符串中包含的整数求和

时间:2015-05-21 23:20:15

标签: python

所以我最近在完成大部分LPTHW之后,选择了John Guttag的计算和使用Python编程简介,修订版和扩展版。我正在和MIT OCW 006一起使用这本书。现在,我试图完成本书中列出的一个手指练习,特别是第85页第7章,其中作者要求你使用一个实现一个功能。 try-except block:

def sumDigits(s):
"""Assumes s is a string
   Returns the sum of the decimal digits in s
   For example, if is is'a2b3c' it returns 5"""

这是我的代码:

def sumDigits(s):
  try:  
    total = 0
    list1 = [s]
    new_list = [x for x in list1 if x.isdigit()]
    for e in new_list:
      total += new_list[e]
    return total
  except TypeError:
    print "What you entered is not a string."

当我使用测试输入在IDLE中运行此程序时,总计计算为零,表示new_list的所有元素都没有传递给累加器。有人可以建议为什么吗?感谢。

5 个答案:

答案 0 :(得分:2)

看起来Rafael已经指出了这些错误,但是仍然需要注意的是,采用这种方式的pythonic方法就越多:

return sum([int(x) for x in s if x.isdigit()]) 

答案 1 :(得分:1)

您的代码实际上有几处错误。
让我们详细分解它们

主要问题在于以下几行:

list1 = [s]
new_list = [x for x in list1 if x.isdigit()]

你应该首先直接在字符串上循环

new_list = [x for x in s if x.isdigit()] #s is the input string

当您创建新列表时,x中的变量x for x in list1将作为列表的元素发生。因此,在您的情况下,列表将只有一个元素,恰好是整个字符串(因为您将列表定义为[s]。由于整个字符串不是数字,new_list将是一个空列表。
这就是为什么你得到0作为回报。

但是,如果直接遍历字符串,x将作为字符串中的每个字母发生,然后就可以检查x是否为数字。

强调new_list[e]会提升IndexError也很重要。您应该仅针对e更正。 for e in new_list的sintax使局部变量e假定列表中的每个值,因此您不必通过索引获取值:您可以使用{{1}直接
最后,为了对new_list中的值求和,值应为整数(e)而不是字符串(int),因此在求和之前必须将值转换为str (或者,您可以使用int代替int在列表推导期间将每个元素投射到int(x) for x in s if x.isdigit()。另外,为了检查输入是否为字符串,如果你在python2中,最好使用x for x in s if x.isdigit(),如果你使用python3,最好使用isinstance(s, basestring)

所以整个代码看起来像这样:

isinstance(s, str)

答案 2 :(得分:0)

我正在阅读同一本书以及关于edX的MITx:6.00.1x课程;这是我的解决方案:

def sumDigits(s):
    '''
    Assumes s is a string
    Returns the sum of the decimal digits in s
    For example, if s is 'a2b3c' it returns 5
    '''
    result = 0
    try:
        for i in range(len(s)):
            if s[i].isdigit():
                result += int(s[i])
        return result
    except:
        print('Your input is not a string.')

由于我们假设s是一个字符串,所以except块应该处理s不是字符串的情况。这么简单,但一开始对我来说并不明显。

答案 3 :(得分:0)

您可以使用 reduce 方法

reduce( (lambda x, y: x + y), [int(x) for x in new if x.isdigit()] )

答案 4 :(得分:0)

我也在读同一本书。我认为我们应该使用try-except块来确定字符串的字符是否可转换为整数。所以这是我的解决方案。

from requests_html import HTMLSession

with open('path_to_my_javascript_file', 'rb') as js:
    script = '() => {' + js.read().decode() + 'return globalFunc()}'

session = HTMLSession()

r = session.get('http://rheal.com.br/vagas')

r.html.render(script=script)

print(r.html.text)