Как найти индекс второго вхождения питон

You can get the second easily enough by using list slices. In the example below, we find the index of the first occurance and then find the index of the first occurance in the sub-list that begins just after the first occurance.

x=[["hi hello"], ["this is other"],["this"],["something"],["this"],["last element"]]
for line in x:
    first=x.index(line)
    second=x[first+1:].index(line)
    #code

Bare in mind that using list.index() will return a ValueError if the object isn’t in the list. Thus you may want some exception handling around your inner loop.

So the final code will look somewhat closer to this:

x=[["hi hello"], ["this is other"],["this"],["something"],["this"],["last element"]]
for line in x:
    print lines
    try:
        first=x.index(line)
        second=x[first+1:].index(line)
    except:
        first,second=-1,-1
    print first,second
    #code

Даны 2 строки. Необходимо найти индекс второго вхождения второй строки в первую.

def second_index(text, symbol) -> [int, None]:
    """
        returns the second index of a symbol in a given text
    """
    # your code here
    if text.find(symbol)==True:
        if text.find(symbol,text.find(symbol)+1)==True:
          l=text.find(symbol)
          text = text.find(symbol,l+1)
        else:
          return None
    else:
        return None
    return text


if __name__ == '__main__':
    print('Example:')
    print(second_index("sims", "s"))

    # These "asserts" are used for self-checking and not for an auto-testing
    assert second_index("sims", "s") == 3, "First"
    assert second_index("find the river", "e") == 12, "Second"
    assert second_index("hi", " ") is None, "Third"
    assert second_index("hi mayor", " ") is None, "Fourth"
    assert second_index("hi mr Mayor", " ") == 5, "Fifth"
    print('You are awesome! All tests are done! Go Check it!')

user207200's user avatar

user207200

5,0908 золотых знаков23 серебряных знака41 бронзовый знак

задан 20 авг 2019 в 11:57

Whatis's user avatar

1

def second_index(text, symbol):
    return text.find(symbol, text.find(symbol) + 1) if text.count(symbol) > 1 else None

assert second_index("sims", "s") == 3, "First"
assert second_index("find the river", "e") == 12, "Second"
assert second_index("hi", " ") is None, "Third"
assert second_index("hi mayor", " ") is None, "Fourth"
assert second_index("hi mr Mayor", " ") == 5, "Fifth"

ответ дан 20 авг 2019 в 12:14

user207200's user avatar

user207200user207200

5,0908 золотых знаков23 серебряных знака41 бронзовый знак

def second_index(text, symbol) -> [int, None]:
    if text.find(symbol) != -1:
        if text.find(symbol,text.find(symbol)+1) != -1:
          l=text.find(symbol,text.find(symbol)+1)
        else:
          return None
    else:
        return None
    return l


print('Example:')
print(second_index("sims", "s"))
# These "asserts" are used for self-checking and not for an auto-testing
assert second_index("sims", "s") == 3, "First"
assert second_index("find the river", "e") == 12, "Second"
assert second_index("hi", " ") is None, "Third"
assert second_index("hi mayor", " ") is None, "Fourth"
assert second_index("hi mr Mayor", " ") == 5, "Fifth"
print('You are awesome! All tests are done! Go Check it!')

Вы были близки к истине.

  1. Только метод find() в случае нахождения чего-то возвращает индекс,
    иначе – -1. Ни о каких True и False там речи не идёт
  2. Возвращать всё-таки следует индекс, а не сам текст, если хотите на
    выходе int получить
  3. Вы немного намудрили с функциями поиска. Второй поиск уже ищет
    нужное значение, нужно его сохранять и возвращать

ответ дан 20 авг 2019 в 12:12

V-Mor's user avatar

V-MorV-Mor

5,1171 золотой знак13 серебряных знаков31 бронзовый знак

2

Михаил Кростелев

@twistfire92

Python backend developer

s='aaaaaabaaaaabaaaabaaaab'
pos = s.find('b',s.find('b')+1)

В переменную pos будет записано второе вхождение символа ‘b’

По сути, вторым параметром в методе find() указываешь позицию, следующую после первого вхождения нужного символа

Ответ написан

более трёх лет назад


Комментировать


Комментировать

Skip to content

Задача «Второе вхождение»

Условие

Дана строка. Найдите в этой строке второе вхождение буквы f, и выведите индекс этого вхождения. Если буква f в данной строке встречается только один раз, выведите число -1, а если не встречается ни разу, выведите число -2.

Задача «Второе вхождение» решение от разработчиков на Python:

Смотреть видео — Задача «Второе вхождение» решение и разбор программы на Python

Делитесь с друзьями ссылкой на ответ и задавайте вопросы в комментариях! 👇

Related Posts

Посмотреть все комментарии

wpDiscuz

0

Оставьте комментарий! Напишите, что думаете по поводу статьи.x

Строка считывается со стандартного ввода функцией input(). Напомним,
что для двух строк определа операция сложения (конкатенации), также определена
операция умножения строки на число.

Строка состоит из последовательности символов. Узнать количество символов (длину строки)
можно при помощи функции len:

>>> S = 'Hello'
>>> print(len(S))
5

Срезы (slices)

Срез (slice) — извлечение из данной строки одного символа или некоторого фрагмента
подстроки или подпоследовательности.

Есть три формы срезов. Самая простая форма среза: взятие одного символа
строки, а именно, S[i] — это срез, состоящий из одного символа,
который имеет номер i, при этом считая, что нумерация начинается
с числа 0. То есть если S='Hello', то
S[0]=='H', S[1]=='e', S[2]=='l',
S[3]=='l', S[4]=='o'.

Номера символов в строке (а также в других структурах данных: списках, кортежах)
называются индексом.

Если указать отрицательное значение индекса, то номер будет отсчитываться
с конца, начиная с номера -1. То есть S[-1]=='o',
S[-2]=='l', S[-3]=='l', S[-4]=='e',
S[-5]=='H'.

Или в виде таблицы:

Строка S H e l l o
Индекс S[0] S[1] S[2] S[3] S[4]
Индекс S[-5] S[-4] S[-3] S[-2] S[-1]

Если же номер символа в срезе строки S больше либо равен len(S),
или меньше, чем -len(S), то при обращении к этому символу строки произойдет
ошибка IndexError: string index out of range.

Срез с двумя параметрами: S[a:b]
возвращает подстроку из b-a символов,
начиная с символа c индексом a,
то есть до символа с индексом b, не включая его.
Например, S[1:4]=='ell', то же самое получится
если написать S[-4:-1]. Можно использовать как положительные,
так и отрицательные индексы в одном срезе, например, S[1:-1] —
это строка без первого и последнего символа (срез начинается с символа с индексом 1 и
заканчиватеся индексом -1, не включая его).

При использовании такой формы среза ошибки IndexError
никогда не возникает. Например, срез S[1:5]
вернет строку 'ello', таким же будет результат,
если сделать второй индекс очень большим, например,
S[1:100] (если в строке не более 100 символов).

Если опустить второй параметр (но поставить двоеточие),
то срез берется до конца строки. Например, чтобы удалить
из строки первый символ (его индекс равен 0, то есть
взять срез, начиная с символа с индексом 1), то можно
взять срез S[1:], аналогично
если опустиить первый параметр, то срез берется от начала строки.
То есть удалить из строки последний символ можно при помощи среза
S[:-1]. Срез S[:] совпадает с самой строкой
S.

Если задать срез с тремя параметрами S[a:b:d],
то третий параметр задает шаг, как в случае с функцией
range, то есть будут взяты символы с индексами
a, a+d, a+2*d и т.д.
При задании значения третьего параметра, равному 2, в срез попадет
кажый второй символ, а если взять значение среза, равное
-1, то символы будут идти в обратном порядке.

Методы

Метод — это функция, применяемая к объекту, в данном случае — к строке.
Метод вызывается в виде Имя_объекта.Имя_метода(параметры).
Например, S.find("e") — это применение к строке S
метода find с одним параметром "e".

Метод find и rfind

Метод find находит в данной строке (к которой применяется метод)
данную подстроку (которая передается в качестве параметра).
Функция возвращает индекс первого вхождения искомой подстроки.
Если же подстрока не найдена, то метод возвращает значение -1. Например:

>>> S = 'Hello'
>>> print(S.find('e'))
1
>>> print(S.find('ll'))
2
>>> print(S.find('L'))
-1

Аналогично, метод rfind возвращает индекс последнего вхождения
данной строки (“поиск справа”).

>>> S = 'Hello'
>>> print(S.find('l'))
2
>>> print(S.rfind('l'))
3

Если вызвать метод find с тремя параметрами
S.find(T, a, b), то поиск будет осуществляться
в срезе S[a:b]. Если указать только два параметра
S.find(T, a), то поиск будет осуществляться
в срезе S[a:], то есть начиная с символа с индексом
a и до конца строки. Метод S.find(T, a, b)
возращает индекс в строке S, а не индекс относительно
начала среза.

Метод replace

Метод replace заменяет все вхождения одной строки на другую. Формат:
S.replace(old, new) — заменить в строке S
все вхождения подстроки old на подстроку new. Пример:

>>> 'Hello'.replace('l', 'L')
'HeLLo'

Если методу replace задать еще один параметр: S.replace(old, new, count),
то заменены будут не все вхождения, а только не больше, чем первые count из них.

>>> 'Abrakadabra'.replace('a', 'A', 2)
'AbrAkAdabra'

Метод count

Подсчитывает количество вхождений одной строки в другую строку. Простейшая
форма вызова S.count(T)  возвращает число вхождений строки
T внутри строки S. При этом подсчитываются только
непересекающиеся вхождения, например:

>>> 'Abracadabra'.count('a')
4
>>> ('a' * 100000).count('aa')
50000

При указании трех параметров S.count(T, a, b),
будет выполнен подсчет числа вхождений строки T
в срез S[a:b].

Упражнения

01: Делаем срезы

Дана строка.

Сначала выведите третий символ этой строки.

Во второй строке выведите предпоследний символ этой строки.

В третьей строке выведите первые пять символов этой строки.

В четвертой строке выведите всю строку, кроме последних двух символов.

В пятой строке выведите все символы с четными индексами (считая, что
индексация начинается с 0, поэтому символы выводятся начиная с первого).

В шестой строке выведите все символы с нечетными индексами, то есть
начиная со второго символа строки.

В седьмой строке выведите все символы в обратном порядке.

В восьмой строке выведите все символы строки через один
в обратном порядке, начиная с последнего.

В девятой строке выведите длину данной строки.

Ввод Вывод
Абракадабра
р
р
Абрак
Абракадаб
Аркдба
бааар
арбадакарбА
абдкрА
11

02: Количество слов

Дана строка, состоящая из слов, разделенных пробелами. Определите, сколько в ней слов.
Используйте для решения задачи метод count.

Ввод Вывод
Hello world
2

03: Две половинки

Дана строка. Разрежьте ее на две равные части (если длина строки — четная, а если
длина строки нечетная, то длина первой части должна быть на один символ больше). Переставьте
эти две части местами, результат запишите в новую строку и выведите на экран.

При решении этой задачи нельзя пользоваться инструкцией if.

Ввод Вывод
Hi
iH
Hello
loHel

04: Переставить два слова

Дана строка, состоящая ровно из двух слов, разделенных пробелом. Переставьте эти слова
местами. Результат запишите в строку и выведите получившуюся строку.

При решении этой задачи нельзя пользоваться циклами и инструкцией if.

Ввод Вывод
Hello world
world Hello

05: Первое и последнее вхождение

Дана строка. Если в этом числе буква f встречается
только один раз, выведите её индекс. Если она встречается два и более раз,
выведите индекс её первого и последнего появления. Если буква
f в данной строке не встречается, ничего не выводите.

При решении этой задачи нельзя использовать метод count и циклы.

Ввод Вывод
comfort
3
office
1 2

06: Второе вхождение

Дана строка. Найдите в этой строке второе вхождение
буквы f, и выведите индекс этого вхождения. Если
буква f в данной строке встречается только один
раз, выведите число -1, а если не встречается
ни разу, выведите число -2.

При решении этой задачи нельзя использовать метод count. Метод find
(а также rfind) можно вызывать не более двух раз. Для решения этой задачи нельзя использовать циклы.

Ввод Вывод
comfort
-1
coffee
3

07: Удаление фрагмента

Дана строка, в которой буква h встречается минимум два раза.
Удалите из этой строки первое и последнее вхождение буквы h,
а также все символы, находящиеся между ними.

Методом replace пользоваться нельзя.

Ввод Вывод
In the hole in the ground there lived a hobbit
In tobbit

08: Обращение фрагмента

Дана строка, в которой буква h встречается
как минимум два раза. Разверните последовательность символов,
заключенную между первым и последнием появлением буквы
h, в противоположном порядке.

Методом replace пользоваться нельзя.

Ввод Вывод
In the hole in the ground there lived a hobbit
In th a devil ereht dnuorg eht ni eloh ehobbit

09: Дублирование фрагмента

Дана строка, в которой буква h встречается
как минимум два раза. Повторите последовательность символов,
заключенную между первым и последнием появлением буквы
h два раза, сами буквы h повторять не надо.

Методом replace пользоваться нельзя.

Ввод Вывод
In the hole in the ground there lived a hobbit
In the hole in the ground there lived a e hole in the ground there lived a hobbit

10: Замена подстроки

Дана строка. Замените в этой строке все цифры 1 на слово
one.

Ввод Вывод
1+1=2
one+one=2

11: Удаление символа

Дана строка. Удалите из этой строки все символы @.

Ввод Вывод
Bilbo.Baggins@bagend.hobbiton.shire.me
Bilbo.Bagginsbagend.hobbiton.shire.me

12: Замена внутри фрагмента

Дана строка. Замение в этой строке все появления буквы h
на букву H, кроме первого и последнего вхождения.

Ввод Вывод
In the hole in the ground there lived a hobbit
In the Hole in tHe ground tHere lived a hobbit

13: Вставка символов

Дана строка. Получите новую строку, вставив между каждыми соседними символами
исходной строки символ *. Выведите полученную строку.

Ввод Вывод
Python
P*y*t*h*o*n

14: Удалить каждый третий символ

Дана строка. Удалите из нее все символы, чьи индексы делятся на 3.

Ввод Вывод
Python
yton

15: Метод бутерброда

Секретное агентство решило для шифрования переписки своих сотрудников использовать «метод бутерброда».
Сначала буквы слова нумеруются в таком порядке: первая буква получает номер 1, последняя буква — номер 2,
вторая – номер 3, предпоследняя – номер 4, потом третья … и так для всех букв (см. рисунок).
Затем все буквы записываются в шифр в порядке своих номеров. Например, слово «sandwich» зашифруется в «shacnidw».

К сожалению, программист агентства, написал только программу шифрования и уволился.
И теперь агенты не могут понять, что же они написали друг другу. Помогите им.

Вводится слово, зашифрованное методом бутерброда. Выведите расшифрованное слово.

Ввод Вывод
Aabrrbaacda
Abracadabra

16: Маски имен файлов

Для групповых операций с файлами используются маски имён файлов. Маска представляет собой последовательность букв,
цифр и прочих допустимых в именах файлов символов, в которой также могут встречаться следующие символы.

Символ «?» (вопросительный знак) означает ровно один произвольный символ.

Символ «*» (звёздочка) означает любую последовательность символов произвольной длины, в том числе «*» может задавать и пустую последовательность.

Напишите программу, которая для каждого имени файла определит, подходит ли оно под заданную маску.
Гарантируется, что в маске файла присутствует не более одного символа «*».

В первой строке содержится маска файла. В следующей строке содержится имя файла по одному в строке.
Имя файла состоят из маленьких латинских букв, цифр и символа «.» (точка), в маске также могут содержаться символы «?» и «*»
(символ «*» — не более одного раза).

Выведите слово «YES» если оно удовлетворяет маске и «NO» иначе.

Ввод Вывод
?or*.d??
fort.doc
YES
?or*.d??
ford.doc
YES
?or*.d??
lord2.doc
YES
?or*.d??
orsk.dat
NO
?or*.d??
port
NO

Добавить комментарий