私は持っています:
関数:def find_str(s, char)
および文字列:"Happy Birthday"
、
基本的に"py"
を入力して3
を返したいのですが、代わりに2
を取得し続けます。
コード:
def find_str(s, char):
index = 0
if char in s:
char = char[0]
for ch in s:
if ch in s:
index += 1
if ch == char:
return index
else:
return -1
print(find_str("Happy birthday", "py"))
何が悪いのかわかりません!
理想的には、 str.find または str.indexを使用します。しかし、あなたはできないと言いました...
問題は、コードが検索文字列の最初の文字(最初の文字)のみをインデックス2に検索することです。
基本的に、char[0]
がs
にある場合、ch == char[0]
が3を返すまでindex
を増やしますが、テストしたときに3が返されましたが、まだ間違っていました。これを行う方法を次に示します。
def find_str(s, char):
index = 0
if char in s:
c = char[0]
for ch in s:
if ch == c:
if s[index:index+len(char)] == char:
return index
index += 1
return -1
print(find_str("Happy birthday", "py"))
print(find_str("Happy birthday", "rth"))
print(find_str("Happy birthday", "rh"))
次の出力が生成されました。
3
8
-1
pythonでこれを行う文字列オブジェクトの組み込みメソッドがありますか?
s = "Happy Birthday"
s2 = "py"
print s.find(s2)
Pythonは「バッテリーを含む言語」であり、既に望んでいることの大部分を実行するために記述されたコードがあります(これが宿題でない限り)。
編集:文字列が見つからない場合、find
は-1を返します。
find()
の使用に関する@dementedハリネズミの答えに追加
効率に関して
find()
を呼び出す前に、s1がs2にあるかどうかを最初に確認する価値があります。
ほとんどの場合、s1はs2の部分文字列ではないことがわかっている場合、これはより効率的です。
in
演算子は非常に効率的であるため
s1 in s2
変換する方が効率的です:
index = s2.find(s1)
に
index = -1
if s1 in s2:
index = s2.find(s1)
これは、find()
が-1を多く返す場合に役立ちます。
find()
が私のアルゴリズムで何度も呼び出されていたので、かなり速くなったので、言及する価値があると思いました
「in」は無効なので、パーティーに遅れて、同じものを探していました。次のように作成しました。
def find_str(full, sub):
index = 0
sub_index = 0
position = -1
for ch_i,ch_f in enumerate(full) :
if ch_f.lower() != sub[sub_index].lower():
position = -1
sub_index = 0
if ch_f.lower() == sub[sub_index].lower():
if sub_index == 0 :
position = ch_i
if (len(sub) - 1) <= sub_index :
break
else:
sub_index += 1
return position
print(find_str("Happy birthday", "py"))
print(find_str("Happy birthday", "rth"))
print(find_str("Happy birthday", "rh"))
生産する
3
8
-1
大文字と小文字を区別しない検索が必要ない場合は、lower()を削除します。
質問に直接答えていませんが、最近、特定の文字列で部分文字列が繰り返される回数を数えるように求められた同様の質問がありました。これが私が書いた関数です。
def count_substring(string, sub_string):
cnt = 0
len_ss = len(sub_string)
for i in range(len(string) - len_ss + 1):
if string[i:i+len_ss] == sub_string:
cnt += 1
return cnt
Find()関数は、おそらく最初の発生のインデックスのみを返します。単にカウントする代わりにインデックスを保存すると、サブストリングがストリング内で繰り返されるインデックスの明確なセットを得ることができます。
免責事項:私はPythonプログラミングを初めて使用します。