63

私はいくつかの簡単なコードを手に入れました:

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か?

4

12 に答える 12

113

これは、最初に発生しstr.index(ch)たインデックスを返すためです。ch試す:

def find(s, ch):
    return [i for i, ltr in enumerate(s) if ltr == ch]

これにより、必要なすべてのインデックスのリストが返されます。

PS Hugh's answer はジェネレーター関数を示しています (インデックスのリストが大きくなる可能性がある場合は違いがあります)。[]この機能は、 に変更することでも調整できます()

于 2012-06-20T14:58:50.777 に答える
23

私は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)]
于 2012-06-20T15:19:33.130 に答える
18

Levの答えは私が使用するものですが、元のコードに基づくものは次のとおりです。

def find(str, ch):
    for i, ltr in enumerate(str):
        if ltr == ch:
            yield i

>>> list(find("ooottat", "o"))
[0, 1, 2]
于 2012-06-20T15:04:06.813 に答える
11
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
于 2012-06-20T15:01:07.460 に答える
3

すべての位置を 1 行で取得する

word = 'Hello'
to_find = 'l'

# in one line
print([i for i, x in enumerate(word) if x == to_find])
于 2021-06-03T15:05:14.040 に答える