15
def get_digits(str1):
    c = ""

    for i in str1:
        if i.isdigit():
            c += i
            return c

以上是我使用的代码,问题是它只返回字符串的第一个数字。为此,我必须同时保留 for 循环和 return 语句。任何人都知道如何修复?

谢谢。

4

6 回答 6

27

正如其他人所说,你的缩进有语义问题,但你不必编写这样的函数来做到这一点,一种更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
于 2012-08-17T12:19:00.863 回答
11

您的缩进有点无聊(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())
于 2012-08-17T12:16:45.253 回答
2

这是因为您的return语句在 for 循环内,所以它在第一个 trueif条件后返回并停止。

  def get_digits(str1):
      c = ""
      for i in str1:
        if i.isdigit():
            c += i
      return c
于 2012-08-17T12:15:47.500 回答
1

有一个缩进问题,当它找到第一个数字时返回,与当前缩进一样,它被解释为语句内部的语句,它需要与被视为外部语句if的语句平行。forfor

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
        }
    }
}

并且当更正代码以将 return 语句与 对齐时for,等效为:

def get_digits(str1){
        c = ""

        for i in str1 {
            if i.isdigit(){
                c += i               
            }
        }
        return c    # Correct as required
    }
于 2012-08-17T12:15:07.593 回答
1

您的代码几乎没问题,除了需要将return语句移动到您的for-loop 级别。

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 中确实很重要(与许多其他语言不同)。

于 2012-08-17T12:15:37.947 回答
1

当然它只返回第一个数字,你明确告诉 Python 一旦你有一个数字就返回。

更改return语句的缩进,它应该可以工作:

def get_digits(str1):
    c = ""

    for i in str1:
        if i.isdigit():
            c += i

    # Note the indentation here
    return c
于 2012-08-17T12:16:26.890 回答