在python中从一个数字字符串中查找奇数之和

在python中从一个数字字符串中查找奇数之和,python,sum,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转换成整数,但它总是给我整数,这是一个不可接受的错误 def

这个问题要求在给定一串数字时求奇数之和。 例如,如果我们得到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转换成整数,但它总是给我整数,这是一个不可接受的错误

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

这应该适合您:

def sumoddnums: 如果inti%2==0,则返回sum0,否则s中i的inti为 或者,如果要保留第一次尝试,则应迭代str,然后检查每个字符int的条件:

def sumoddnums: 总数=0 对于s中的i: 如果inti%2==1: 总计+=单位 返回总数 printsumoddnum'12345'
这应该适合您:

def sumoddnums: 如果inti%2==0,则返回sum0,否则s中i的inti为 或者,如果要保留第一次尝试,则应迭代str,然后检查每个字符int的条件:

def sumoddnums: 总数=0 对于s中的i: 如果inti%2==1: 总计+=单位 返回总数 printsumoddnum'12345'
我喜欢在这里使用正则表达式方法。我们可以将regex模式[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

我喜欢在这里使用正则表达式方法。我们可以将regex模式[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

以下是一个更好、更具可读性的解决方案:

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"

以下是一个更好、更具可读性的解决方案:

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"
若在for循环中使用“rangelens”而不是“s”,它将给出[0,1,2,3,4],即0到“12345”的长度

因此,只需将范围更改s,然后它将为您提供字符串“12345”的字符元素['1'、'2'、'3'、'4'、'5']

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

若在for循环中使用“rangelens”而不是“s”,它将给出[0,1,2,3,4],即0到“12345”的长度

因此,只需将范围更改s,然后它将为您提供字符串“12345”的字符元素['1'、'2'、'3'、'4'、'5']


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

您的第一种方法不起作用,因为您实际添加到总和的是s而不是it元素的“索引”。可能的工作是将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函数,其目的是不言自明的,但您需要记住的是,它以iterables作为输入

您可能会得到如下结果:

def sumoddnum(s):
    return sum(int(i) for i in s if int(i) % 2 == 1)
使用Python 3.8,您还可以使用全新的walrus操作符:

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

Python解释器本身已经解释了第二种方法的问题。您已经将字符串转换为整数,并且没有内置的方式对整数进行循环。您需要找到并实现自己的整数数字循环方法提示:使用模10的余数。

您的第一种方法不起作用,因为您实际添加到总和的是元素的“索引”,而不是元素的“索引”。可能的工作是将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函数,其目的是不言自明的,但您需要记住的是,它以iterables作为输入

您可能会得到如下结果:

def sumoddnum(s):
    return sum(int(i) for i in s if int(i) % 2 == 1)
使用Python 3.8,您还可以使用全新的walrus操作符:

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

Python解释器本身已经解释了第二种方法的问题。您已经将字符串转换为整数,并且没有内置的方式对整数进行循环。您需要找到并实现自己的整数数字循环方式提示:使用模10的余数。

程序无法运行的原因是因为行:

for i in range(len(str)):
这里,您将获取从0到字符串长度(不包括长度)的所有i值

这意味着您要将从0到字符串长度的所有奇数相加

反而 这样做:

这将为您提供字符串中的每个字符作为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'))

程序无法运行的原因是因为行:

for i in range(len(str)):
这里,您将获取从0到字符串长度(不包括长度)的所有i值

这意味着您要将从0到字符串长度的所有奇数相加

而是这样做:

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

这绝对不是更好、更具可读性。您的类型批注本身不正确,请使用Union[],而不是或。永远不要使用类型…==,使用isinstance,或在极少数情况下,测试身份。测试str,然后冗余地转换为str。代码在一个简单的str调用将输入转换为sting就足够了的地方重复,这绝对不是更好和更可读的。您的类型批注本身不正确,请使用Union[],而不是或。永远不要使用类型…==,使用isinstance,或在极少数情况下,测试身份。测试str,然后冗余地转换为str。当一个简单的str调用将输入转换为sting就足够了时,代码会重复自身。