Подтвердить что ты не робот

Python - найти char в строке - могу ли я получить все индексы?

У меня есть простой код:

def find(str, ch):
    for ltr in str:
        if ltr == ch:
            return str.index(ltr)
find("ooottat", "o")

Функция возвращает только первый индекс. Если я вернусь к печати, он напечатает 0 0 0. Почему это и есть ли способ получить 0 1 2?

4b9b3361

Ответ 1

Это потому, что str.index(ch) возвращает индекс, где ch происходит в первый раз. Попробуйте:

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

Это вернет список всех необходимых вам индексов.

P.S. Ответ Хью показывает функцию генератора (имеет значение, если список индексов может стать большим). Эту функцию можно также изменить, изменив [] на ().

Ответ 2

Я бы пошел с Лев, но стоит отметить, что если вы закончите более сложные поиски, которые могут быть полезны при использовании re.finditer(но они часто вызывают больше проблем, чем стоит, но иногда их удобно знать)

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)]

Ответ 3

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

Ответ 4

Lev answer - это тот, который я бы использовал, однако здесь что-то основано на вашем исходном коде:

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

>>> list(find("ooottat", "o"))
[0, 1, 2]

Ответ 5

Вы можете попробовать это

def find(ch,string1):
    for i in range(len(string1)):
        if ch == string1[i]:
            pos.append(i)        

Ответ 6

Используя pandas, мы можем сделать это и вернуть dict со всеми индексами, простой версией:

import pandas as pd

d = (pd.Series(l)
     .reset_index()
     .groupby(0)['index']
     .apply(list)
     .to_dict())

Но мы можем строить и в условиях, например. только если два или более случаев:

d = (pd.Series(l)
     .reset_index()
     .groupby(0)['index']
     .apply(lambda x: list(x) if len(list(x)) > 1 else None)
     .dropna()
     .to_dict())

Ответ 7

Множество альтернатив с использованием регулярных выражений

import re

iter = re.finditer(r'o ', searchString)

indexes = [x.start() для x в iter]

Индексы - это список индексов строк для совпадений