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
インデントが少し崩れています (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 ループ内にあるためです。そのため、最初の真のif
条件の後に戻り、停止します。
def get_digits(str1):
c = ""
for i in str1:
if i.isdigit():
c += i
return c
もちろん、それは最初の数字だけを返します。数字を取得したらすぐに戻るように Python に明示的に指示します。
return
ステートメントのインデントを変更すると、機能するはずです。
def get_digits(str1):
c = ""
for i in str1:
if i.isdigit():
c += i
# Note the indentation here
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
}
}
}
また、return ステートメントを に合わせて移動するようにコードを修正すると、次のよう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 では非常に重要です (他の多くの言語とは異なります) 。