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 ループ内にあるためです。そのため、最初の真のif条件の後に戻り、停止します。

  def get_digits(str1):
      c = ""
      for i in str1:
        if i.isdigit():
            c += i
      return c
于 2012-08-17T12:15:47.500 に答える
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 に答える
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

ステートメントをループのレベルに移動する必要があることを除いて、コードはほとんど問題ありませんでした。returnfor

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 に答える