Робота з іммутабельним рядковим типом даних в Python

При роботі з текстовими даними в python важливо пам’ятати про іммутабельність даного типу даних.  Тобто якщо зі списками ми можемо змінити елемент списку прямо у списку, то при роботі з текстовими даними, нам буде потрібно фактично створення нової змінної. Для прикладу замінимо третій елемент в списку:

>>> a = [11, 22, 33, 44, 55]

>>> a[3] = 99

>>>a

[11, 22, 33, 99, 55]

Все логічно. Для тих, хто здивувався, нагадаємо, що індекс відраховується від нуля.

Тепер поміняємо в слові третю букву.

>>>a = 'бабайка'

>>>print(a[3])

a

>>>a[3] = 'у'

Traceback (most recent call last):

  File "<pyshell#10>", line 1, in <module>

    a[3] = 'у'

TypeError: 'str' object does not support item assignment

 

Тобто ми отримали помилку python.  Задачу заміни букви можна легко розв'язати за допомогою зрізів і конкатенації:

>>>a = 'бабайка'

>>>a = a[:3] + 'у' +  a[4:]

>>>a

'бабуйка'

 

Якщо нам треба не третій символ в рядковій величині, а символи замінити на інши символи, то для цього у Python є готовий інструментарій і це простіше.

А тепер – дискотека. Тобто задача.

 


 

Перше та останнє входження (4726)

https://www.e-olymp.com/uk/problems/4726

 

Задано рядок літер. Якщо у ньому літера f зустрічається лише один раз, виведіть її індекс (нумерація індексів з 0).

Якщо вона зустрічається два або більше разів, виведіть індекс її першої та останньої появи.

Якщо літера f у заданому рядку не зустрічається, нічого не виводьте.

 

Вхідні дані

Один рядок з не більш ніж 255 літер.

Вихідні дані

Виведіть відповідь в залежності від того скільки разів у вхідному рядку зустрічається літера f.

 

Ліміт часу 1 секунда

Ліміт використання пам'яті 128 MiB

 

Вхідні дані #1

comfort

 

Вихідні дані #1

3

 

Вхідні дані #2

office

 

Вихідні дані #2

1 2

 


 

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

s = input()

first = s.find('f')  

# функція s.find()  повертає індекс позиції, де зустрічається символ 'f',

# пошук відбувається від початку рядкової змінної.

#  Якщо символ не знайдено, функція повертає  -1

 

if first != -1:

    print (first, end = '')

    s = s.replace('f','z',1)

#  Функція s.replace(old, new, count) замінить count символів old на new, якщо не вказати count, то замінить всі.

 

Для закінчення написання програми вам, думаю, згодиться функція s.rfind()  що повертає індекс позиції, де зустрічається певний символ,  але пошук відбувається з кінця рядкової змінної. Якщо символ не знайдено, функція повертає  -1.

 

А є ще більш гарний розв'язок - використовувати find і rfind для знаходження крайнього лівого і крайнього правого індексу, потім порівнювати отримане. Якщо числа рівні між собою і не рівні -1 - виводити одне. Якщо не рівні і жодне з них не -1 - виводити обидва.

 

Успіхів!

 


 

Вхід для зареєстрованих відвідувачів