在python中从一个数字字符串中查找奇数之和
这个问题要求在给定一串数字时求奇数之和。 例如,如果我们得到123,我们应该得到4的和 这是我的尝试,它返回不正确的“4”在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
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就足够了时,代码会重复自身。