def get_digits(str1):
c = ""
for i in str1:
if i.isdigit():
c += i
return c
上面是我使用的代码,问题是它只返回字符串的第一个数字。为了解决这个问题,我必须保留for循环和return语句。有人知道如何修复吗?谢谢。
def get_digits(str1):
c = ""
for i in str1:
if i.isdigit():
c += i
return c
上面是我使用的代码,问题是它只返回字符串的第一个数字。为了解决这个问题,我必须保留for循环和return语句。有人知道如何修复吗?就像其他人所说,你的缩进存在语义问题,但你不必编写这样一个函数来解决它,更加Pythonic的方法是:
def get_digits(text):
return filter(str.isdigit, text)
关于解释器:
>>> filter(str.isdigit, "lol123")
'123'
当他人提出“更快”的方法时,请始终自行进行测试:
from timeit import Timer
def get_digits1(text):
c = ""
for i in text:
if i.isdigit():
c += i
return c
def get_digits2(text):
return filter(str.isdigit, text)
def get_digits3(text):
return ''.join(c for c in text if c.isdigit())
if __name__ == '__main__':
count = 5000000
t = Timer("get_digits1('abcdef123456789ghijklmnopq123456789')", "from __main__ import get_digits1")
print t.timeit(number=count)
t = Timer("get_digits2('abcdef123456789ghijklmnopq123456789')", "from __main__ import get_digits2")
print t.timeit(number=count)
t = Timer("get_digits3('abcdef123456789ghijklmnopq123456789')", "from __main__ import get_digits3")
print t.timeit(number=count)
~# python tit.py
19.990989106 # Your original solution
16.7035926379 # My solution
24.8638381019 # Accepted solution
''.join(filter(lambda x: x.isdigit(), "lol123"))
,请参见https://dev59.com/xHM_5IYBdhLWcg3wRw11#1450900。 - asmaierisdigit()
(注意括号)时才需要使用lambda。如上所示使用str.isdigit
即可正常工作。 - JRiggles你的缩进有点混乱(在Python中,缩进非常重要)。更好的方式是:
def get_digits(str1):
c = ""
for i in str1:
if i.isdigit():
c += i
return c
使用生成器表达式的一种更短、更快的解决方案:
''.join(c for c in my_string if c.isdigit())
这是因为你的return
语句在for循环内部,所以它会在第一个true的if
条件后返回并停止执行。
def get_digits(str1):
c = ""
for i in str1:
if i.isdigit():
c += i
return c
存在一个缩进问题,当它找到第一个数字时就会出现,因为当前的缩进被解释为if
语句内的语句,
它需要与for
语句平行
才能被视为在for
语句之外。
def get_digits(str1):
c = ""
for i in str1:
if i.isdigit():
c += i
return c
digits = get_digits("abd1m4m3m22mmmbb4")
print(digits)
你错误代码的花括号等效形式为:
def get_digits(str1){
c = ""
for i in str1 {
if i.isdigit(){
c += i
return c # Notice the error here
}
}
}
当代码被更正以使返回语句与 for
对齐时,等效的代码如下:
def get_digits(str1){
c = ""
for i in str1 {
if i.isdigit(){
c += i
}
}
return c # Correct as required
}
你的代码几乎没问题,除了需要将return
语句移动到for
循环的层级。
def get_digits(str1):
c = ""
for i in str1:
if i.isdigit():
c += i
return c ## <--- moved to correct level
所以,现在:
get_digits('this35ad77asd5')
'35775'
解释:
以前,您的函数仅返回第一个数字,因为当它找到一个数字时,if
语句被执行,return
也被执行(导致您从函数中返回,这意味着您没有继续查找字符串)。
在Python中,空格/缩进真的很重要,正如您所看到的(与许多其他语言不同)。
当然它只返回第一个数字,你明确告诉Python一旦有数字就立即返回。
更改return
语句的缩进,它应该可以工作:
def get_digits(str1):
c = ""
for i in str1:
if i.isdigit():
c += i
# Note the indentation here
return c