【问题标题】:Adding numbers in a string在字符串中添加数字
【发布时间】:2016-08-22 13:21:04
【问题描述】:

我有一个字符串作为我正在编写的代码的输入,并以该字符串为例:

"12 inches  makes   1   foot"

我的目标是让我的代码通过这个字符串运行,然后取出整数并添加它们。所以上面字符串的输出将是 13。我在这里也使用 try 和 except,因为另一个示例输入字符串可能类似于“pi is 3.14”。

msg= "12    inches  makes   1   foot"

thesum = 0

s= msg.split()

for a in s:

    try:

        if a == int(a):
            a= int(a)
            thesum += a
        print (thesum)
    except ValueError as e:


        print("Value Error: no int present")

我做了上面的事情,但我没有得到它将 a 的值(如果它是一个 int)添加到“thesum”。我怎样才能让它工作?另外,我确实希望在尝试中使用它,但格式除外,以便我可以调用 ValueError

【问题讨论】:

    标签: python string sum try-catch except


    【解决方案1】:

    无需检查字符串是否相等。事实上,只需在解释器中尝试'4' == 4。答案是False,因为字符串和整数从来都不是等价的。只需将 thesum += int(a) 放入循环中,而不是您的 if 语句。如果您不想要try-except,请使用if a.isdigit(): 而不是try:,并完全删除except:

    for a in s:
        if a.isdigit():
            thesum += int(a)
            print(thesum)
    

    一个好的方法是结合几个内置函数:

    string = "12 inches makes 1 foot"
    total = sum(map(int, filter(str.isdigit, string.split())))
    

    filter() 仅查找数字字符。然后我们使用map() 将每个转换为整数,并使用sum() 找到总数。

    【讨论】:

    • 好吧,我绝对是这种格式的粉丝,但我对异常不熟悉,并且正在尝试掌握使用它们的窍门,所以我更喜欢这种格式。此外,我在上面的代码中的 if 语句之前添加了 a= int(a) ,现在它实际上将数字相加,但每次它向总和添加新值时都会打印
    • @Nick:那是因为你把print(thesum) 放在了循环里面。如果这不是您想要的,请将其移动到循环的末尾并取消缩进直到它在外面。
    • 哦,当然,太棒了。另一个问题,既然我已经切换了它,它会继续打印我对 ValueError 的语句以及我拥有的每个非 int 值。只有当整个字符串中没有 int 时,我才能让它引发该错误?对于我上面的第一个示例字符串,在运行它时,它会打印出:值错误:不存在 int,值错误:不存在 int,值错误:不存在 int,13。对于上面的示例,我只想打印 13。
    • @Nick:我会在循环之前用valid = False 定义一个变量。然后,在if 块中,我将其定义为True。然后,将except ValueError as e: 移到循环之外并将其更改为检查有效性。 Here
    【解决方案2】:

    astrint(a)int(如果可能的话),所以 a == int(a) 永远不会相等。

    只需加上int(a)的值,如果转换失败,会引发ValueError

    以下代码应该可以工作。

    msg= "12    inches  makes   1   foot"
    thesum = 0
    s= msg.split()
    for a in s:
        try:
            thesum += int(a)
        except ValueError as e:
            print a
    print thesum
    

    【讨论】:

      【解决方案3】:

      我喜欢“重新”和理解以使其更易于阅读:

      import re
      print(sum(int(a) for a in re.findall(r'\d+', '12 inches make 1 foot')))
      

      然后你可以为浮点数等扩展正则表达式。

      【讨论】:

      • 当你有split() 时,在这里使用正则表达式似乎有点矫枉过正。如果你想处理浮点数,你可以使用isinstance(a, float)import numbers 然后isinstance(a, numbers.Real) 来真正涵盖所有内容。
      【解决方案4】:

      大多数早期方法都忽略了第二个输入,即“pi is 3.14”。尽管已通过声明解析整数的断言提出了问题。它需要将数字视为浮点数才能成功处理第二个输入。

      import unittest
      import re
      
      
      def isDigit(s):
       return re.match(r'[\d.]+', s)
      
      def stringParse(input):
       input = [i.strip() for i in input.split()]
       input = filter(lambda x: isDigit(x), input)
       input = map(lambda x: float(x), input)
       return sum(input)
      
      class TestIntegerMethods(unittest.TestCase):
      
       def test_inches(self):
        self.assertEqual(stringParse("12 inches  makes   1   foot"), 13.0)
      
       def test_pi(self):
        self.assertTrue(stringParse('pi is 3.14'), 3.14)
      
      if __name__ == '__main__':
       unittest.main()
      

      另一个问题

      【讨论】:

      • 这非常有用,谢谢,我想我忘了提到我只是在取整数,因为我的值错误打印语句是“不存在 int”。所以在“pi is 3.14”的情况下,预期的输出将是“Value Error: no int present”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      相关资源
      最近更新 更多