Поиск всех позиций персонажа в строке - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь найти все порядковые номера символа в строке Python, используя очень простой набор навыков.Например, если у меня есть строка «Яблоки совершенно потрясающие», и я хочу найти места, где в строке есть «а».Мой идеальный вывод был бы:

0
7
14
19

Это все места в строке, где появляется 'a' (я думаю)

Это код, который я до сих пор:

sentence = input("Input a string: ")
for ch in sentence:
    x = sentence.find('o')


print(x)

Здесь я ищу 'o' вместо a.Мой мыслительный процесс заключается в том, что для каждого символа в строке функция find будет возвращать позицию «o».Поскольку я не знаю, как долго будет входная строка, я использовал цикл for.Я могу найти и распечатать первый экземпляр «о», но не все.Что я должен делать?Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 22 сентября 2018

Используйте вам понимание списка для большого блага:

[ind for ind, ch in enumerate(sentence) if ch.lower() == 'a']

вернет список всех чисел, которые вы хотите.Печатайте по желанию.

И я предположил, что, исходя из вашего примера, вас не волнует регистр, следовательно, вызов функции lower ().Используя оператор звездочки в звездочке Python 3 (*), вы можете сделать все это в виде одной строки;но это я оставлю как упражнение для читателя.

0 голосов
/ 22 сентября 2018

Использование enumerate - это стандартный путь.Хотя вы можете воспользоваться скоростью str.find для операций, критичных ко времени.

Код

def find_all(s, c):
    idx = s.find(c)
    while idx != -1:
        yield idx
        idx = s.find(c, idx + 1)

print(*find_all('Apples are totally awesome', 'o')) # 12 23

Я сделал приведенный выше возврат генератора для элегантности и для учета очень большойстроки.Положить его, конечно, можно при необходимости на list.

Тест

Вот эталонное решение для решения, использующего enumerate и понимание списка.Оба решения имеют линейную сложность по времени, но str.find значительно быстрее.

import timeit

def find_all_enumerate(s, c):
    return [i for i, x in enumerate(s) if c == 'a']

print(
    'find_all:',
    timeit.timeit("list(find_all('Apples are totally awesome', 'o'))",
                  setup="from __main__ import find_all")
)

print(
    'find_all_enumerate:',
    timeit.timeit("find_all_enumerate('Apples are totally awesome', 'o')",
                  setup="from __main__ import find_all_enumerate")
)

Вывод

find_all: 1.1554179692960915
find_all_enumerate: 1.9171753468076869
0 голосов
/ 22 сентября 2018

Это хорошее место для перечисления , оно позволяет нам получить index and item, когда мы выполняем цикл, поэтому, если мы сопоставим item, мы можем получить соответствующий index, также это полезноиспользовать .lower(), чтобы избежать проблем с соответствующими случаями

s = 'Apples are totally awesome'

l = [idx for idx, item in enumerate(s.lower()) if 'o' in item]

Расширенный цикл:

l = []
for idx, item in enumerate(s.lower()):
    if 'o' in item:
        l.append(idx)
/python/stack$ python3.7 sum.py 
[12, 23]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...