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
?
Ответы
Ответ 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]
Индексы - это список индексов строк для совпадений