私はいくつかの簡単なコードを手に入れました:
def find(str, ch):
for ltr in str:
if ltr == ch:
return str.index(ltr)
find("ooottat", "o")
この関数は最初のインデックスのみを返します。return を print に変更すると、0 0 0 が出力されます。これはなぜですか。取得する方法はあります0 1 2
か?
これは、最初に発生しstr.index(ch)
たインデックスを返すためです。ch
試す:
def find(s, ch):
return [i for i, ltr in enumerate(s) if ltr == ch]
これにより、必要なすべてのインデックスのリストが返されます。
PS Hugh's answer はジェネレーター関数を示しています (インデックスのリストが大きくなる可能性がある場合は違いがあります)。[]
この機能は、 に変更することでも調整できます()
。
私はLevと一緒に行きますが、より複雑な検索が行われる場合は、re.finditerを使用することを覚えておく価値があるかもしれないことを指摘する価値があります(ただし、reは価値よりも多くの問題を引き起こすことがよくありますが、知っておくと便利な場合があります)
test = "ooottat"
[ (i.start(), i.end()) for i in re.finditer('o', test)]
# [(0, 1), (1, 2), (2, 3)]
[ (i.start(), i.end()) for i in re.finditer('o+', test)]
# [(0, 3)]
Levの答えは私が使用するものですが、元のコードに基づくものは次のとおりです。
def find(str, ch):
for i, ltr in enumerate(str):
if ltr == ch:
yield i
>>> list(find("ooottat", "o"))
[0, 1, 2]
def find_offsets(haystack, needle):
"""
Find the start of all (possibly-overlapping) instances of needle in haystack
"""
offs = -1
while True:
offs = haystack.find(needle, offs+1)
if offs == -1:
break
else:
yield offs
for offs in find_offsets("ooottat", "o"):
print offs
結果は
0
1
2
すべての位置を 1 行で取得する
word = 'Hello'
to_find = 'l'
# in one line
print([i for i, x in enumerate(word) if x == to_find])