Добавление чисел в строку
У меня есть строка в качестве ввода для кода, который я пишу, и пусть пример строки:
"12 inches makes 1 foot"
Моя цель - запустить мой код через эту строку и просто вытащить целые числа и добавить их. Таким образом, вывод для строки выше будет 13. Я использую try и за исключением здесь, так как другая примерная строка ввода может быть чем-то вроде "pi равно 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". Как я могу заставить это работать? Кроме того, я хочу иметь его в try, кроме формата, чтобы я мог вызвать ValueError
Ответы
Ответ 1
a
str
, а int(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
Ответ 2
Нет необходимости проверять равенство со строкой. На самом деле попробуйте '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()
.
Ответ 3
Мне нравится "re" и понимание, чтобы было легче читать:
import re
print(sum(int(a) for a in re.findall(r'\d+', '12 inches make 1 foot')))
Затем вы можете расширить регулярное выражение для float и т.д.
Ответ 4
В большинстве предыдущих подходов скидка на второй вход, который равен "pi равно 3,14". Хотя вопрос был задан с заявленным утверждением синтаксического анализа целого числа. Для обработки второго ввода требуется обработка чисел как float.
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()
Другой вопрос о проблеме