在python中从一串数字中找到奇数和

时间:2019-12-01 07:07:48

标签: python sum

该问题要求在给定一串数字时查找奇数之和。 因此,例如,如果给定的值为“ 123”,我们应该得到4的总和。

这是我的尝试,它返回错误的“ 4”

def sumoddnum(s):
    total= 0
    for i in range(len(s)):
        if i % 2 == 1:
            total += i
    return total 
print(sumoddnum('12345'))

我也尝试过将s转换为整数,但它一直给我“ int不可迭代”错误

def sumoddnum(s):
    total= 0
    s= int(s)
    for i in s:
        if i % 2 == 1:
            total += i
    return total 
print(sumoddnum('12345'))

6 个答案:

答案 0 :(得分:1)

这应该对您有用:

def sumoddnum(s):
  return sum(0 if int(i) % 2 == 0 else int(i) for i in s)

或者如果您想继续尝试,则应遍历str,然后检查每个int字符的条件:

def sumoddnum(s):
    total= 0
    for i in s:
        if int(i) % 2 == 1:
            total += int(i)
    return total 
print(sumoddnum('12345'))

答案 1 :(得分:1)

我喜欢在这里使用正则表达式。我们可以将正则表达式模式[13579]应用于输入字符串,然后对所得的奇数列表使用列表推导来求和:

num = "123"
odds = re.findall(r'[13579]', num)
sum = sum(int(odd) for odd in odds)
print("the sum is: " + str(sum))

此打印:

The sum is: 4

答案 2 :(得分:1)

您的第一种方法行不通,因为您实际添加的总和是s的“索引”,而不是元素。可以做的是更改for循环以使其遍历元素而不是其位置。然后请记住,字符串的元素是字符,因此需要转换为int。每当字符实际代表数字时,都可以使用内置的int函数来完成此操作。

def sumoddnum(s):
    total= 0
    for i in s:
        if int(i) % 2 == 1:
            total += int(i)
    return total 

现在您可能会想

  

这么简单的任务有多长的功能!

,您将完全正确。幸运的是,Python随附了一些理解功能,这些功能使我们可以缩短一些for循环和内置的sum函数,这的目的有点不言而喻,但是您需要记住,它以可迭代对象作为输入

您可能会得到如下结果:

def sumoddnum(s):
    return sum(int(i) for i in s if int(i) % 2 == 1)

使用Python 3.8,您还可以使用全新的海象运算符:

def sumoddnum(s):
    return sum(num for i in s if (num := int(i)) % 2 == 1)

第二种方法的问题已经由Python解释器本身解释。您已经将字符串转换为整数,并且没有内置的方法可以遍历整数。您将需要找到并实现自己的方法来循环访问整数(提示:使用10为模的余数)。

答案 3 :(得分:1)

您的程序无法运行的原因是由于以下原因:

for i in range(len(str)):

在这里,您要获取从0到字符串长度(不包括长度)的所有i值。

这意味着,您要将所有从0到String长度的奇数加起来。

相反,这样做:

for i in str:

这会将字符串中的每个字符都赋予i。现在:

i = int(i)

会将其转换为int。

最后:

if i%2 == 1: 
    total+=i

最终代码为:

def sumoddnum(s):
    total= 0
    for i in s:
        i = int(i)
        if i % 2 == 1:
            total += i
    return total 
print(sumoddnum('12345'))

答案 4 :(得分:0)

def sumoddnum(s):
    total= 0
    for i in s:
        i = int(i)
        if i % 2 == 1:
            total += i
    return total 
print(sumoddnum('12345'))

如果在for循环中使用'range(len(s))'而不是's',则会得到[0,1,2,3,4],它是'12345的长度的0。 / p>

因此,需要将范围仅改变s,然后它会给您['1','2','3','4','5']这是字符串'12345的char元素'。

别忘了将i的类型更改为int!

答案 5 :(得分:-1)

这是一个更好,更易读的解决方案:

def add_up(n: str or int):
   if type(n) == str and str(n).isdigit():
       numbers = [int(n) for n in list(n.strip()) if int(n) % 2 != 0]
       return sum(numbers)
   elif type(n) == int:
       numbers = [int(str(n)) for n in list(str(n)) if n % 2 != 0]
       return sum(numbers)
   else:
       return "No digits found to add up"