При роботі з текстовими даними в 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 - виводити обидва.
Успіхів!
Задача 520 — Сума всіх
e-olymp.com/uk/problems/520
Обчисліть суму всіх заданих чисел.
Вхідні дані
Містить n (1 ≤ n ≤ 105) цілих чисел. Всі числа не перевищують 109 за абсолютною величиною.
Вихідні дані
Виведіть суму всіх заданих чисел.
Вхідні дані #1
2 3
1 1
Вихідні дані #1
7
Дана задача – яскравий приклад задачі, для розв’язання якої необхідно використати роботу з файлами. В даній задачі невідомо наперед, в скількох рядках будуть вхідні дані. Коли ж ми отримаємо рядок з вхідного файлу, то далі просто – ми занесемо дані в список, потім знайдемо суму елементів списку за допомогою стандартної функції. Через традиції «Плетива» не публікувати повні лістинги, приведений код вичитує рядки з вхідного файлу і записую їх у вихідний. Модифікувати даний код для розв’язку задачі 502 – сподіваюсь, не проблема.
inputfile = open('input.txt', 'r')
outputfile = open('output.txt', 'w')
for line in inputfile:
outputfile.write(line + '\n')
inputfile.close()
outputfile.close()
ps. Зверніть увагу, на два аспекти:
1. При виводі в файл — outputfile.write(line + '\n') — ми в кінці кожного рядка ставимо '\n' Це символ переведення рядка, якщо його не ставити, то всі рядки будуть "клеїтися" один до одного.
2. Якщо вам треба вивести у вихідний файл число, то необхідно конвертувати його в рядкову величину.
Тобто outputfile.write(str(2017) + line + '\n')
Задача 2097 — Трьохзначі числа
https://www.e-olymp.com/uk/problems/2097
На заданому проміжку [A, B] виведіть у зростаючому порядку всі трьохзначні числа, у яких усі цифри різні.
Вхідні дані
У єдиному рядку два натуральних числа з вказаного проміжку. 100 ≤ A ≤ B ≤ 999.
Вихідні дані
Кожне число виводьте на новому рядку.
Вхідні дані #1
100 105
Вихідні дані #1
102
103
104
105
Джерело: Китеня 2011 м. Ковров
Розв'язання.
Перебираємо всі числа проміжку. В тестовому прикладі це буде:
100
101
102
103
104
105
Але деякі числа нам не підходять, бо мають повтори цифр. Наприклад в числі 101 дві одиниці, тобто не всі цифри різні.
Давайте переберемо всі числа проміжку, кожне з них відконвертуємо в текст, використовуючи стандартну функцію str()
Далі скористаємося функцією створення множини set()
Дана функція на основі відконвертованого в текст числа створить множину, в якій будуть елементи без повторів. Тобто дана функція створить нам множину, в якій не буде дублікатів. До речі, не гарантується, що буде збережено порядок елементів, але для нашої задачі це неважливо.
Ось приклад, що ілюструє роботу функції set()
>>> a = [1,3,5,4,3,3]
>>> a
[1, 3, 5, 4, 3, 3]
>>> b = set(a)
>>> b
{1, 3, 4, 5}
Отже, якщо в тризначному числі всі цифри різні, то довжина множини, що утворена функцією set() буде дорівнювати трьом. Ось як просто це на python:
if len(set(str(i))) == 3
Ось так просто. Зверніть увагу, що писати перебір чисел таким чином:
for i in range (a,b)
невірно, тому що останній елемент (b) в такому разі не буде перебиратися циклом.
Голосні
https://www.e-olymp.com/uk/problems/494
До голосних літер в латинському алфавіті відносяться літери A, E, I, O, U і Y. Інші літери вважаються приголосними. Напишіть програму, яка підраховує кількість голосних літер в тексті.
Вхідні дані
У вхідному файлі міститься один рядок тексту, який складається лише із заглавних латинських літер та проміжків. Довжина рядка не перевищує 100 символів.
Вихідні дані
У вихідний файл вивести одне ціле число – кількість голосних у вхідному тексті.
Вхідні дані
COBRA
Вихідні дані
2
Для розв’язання даної задачі можна скористатися функцією in
Загальна ідея така: Пробіл в тексті також вважаємо буквою (власне, так воно і є). Перебираємо по черзі всі букви тексту. Якщо вибрана буква є серед голосних, то загинаємо палець. Після перевірки всіх букв тексту виводимо кількість загнутих пальців.
В даному випадку доцільно текст і голосні ввести в текстові змінні:
golosni = 'AEIOUY'
Перебір букв тексту проводимо за допомогою циклу, функція in повертає True у випадку, коли буква тексту знайдена серед голосних:
for x in txt:
if x in golosni:
kilkist += 1
Зверніть увагу на конструкцію kilkist+=1 Це і є загинання пальців. Тобто після виконання даної операції значення змінної kilkist збільшується на одиницю. Але якщо до виконання цієї операції змінна kilkist не використовувалась, то ми отримаємо помилку. Тому перед перебиранням букв тексту давайте зробимо так:
kilkist = 0
Так ми і заявимо, що у нас є така змінна (ініціалізуємо її) і встановимо цій змінній початкове значення.
ps. А чи багато, на вашу думку, треба змінити в програмі, щоб вона рахувала не кількість голосних, а кількість пробілів? І чи можна в такому випадку обійтися без функції in ? А яка, на вашу думку, програма буде працювати швидше на одному і тому тексті - та, що рахує кількість голосних чи та, що рахує кількість пробілів?
Середнє арифметичне додатних
https://www.e-olymp.com/uk/problems/910
Задано послідовність дійсних чисел. Визначити середнє арифметичне додатних чисел.
Вхідні дані
У першому рядку задано кількість дійсних чисел n (0 < n ≤ 100). У наступному рядку задано n чисел, значення яких не перевищують за модулем 100.
Вихідні дані
Вивести середнє арифметичне додатних чисел з 2 десятковими знаками. У випадку відсутності додатних чисел вивести повідомлення "Not Found" (без лапок).
Вхідні дані #1
3
5.2 -2 4
Вихідні дані #1
4.60
Використання list comprehension для розв’язання даної задачі допоможе нам ввести дані з одночасним їх фільтруванням. Розбираючи рядок введення, ми можемо вибрати лише додатні елементи. Наприклад, при введенні даних таким чином:
lst = [float(x) for x in input().split()]
ми в списку lst отримаємо всі вхідні дані. А використання умови в list comprehension дозволить нам додати в список лише додатні елементи вхідних даних:
lst = [float(x) for x in input().split() if float(x)>0]
А отримав список додатних чисел ми можемо проаналізувати довжину цього списку за допомогою функції len(). Якщо довжина нульова, це означає що у вхідних даних немає жодного додатного числа. Якщо так сталося, виводимо відповідне повідомлення, інакше виводимо середнє арифметичне. Формати виведення реальних чисел можна знайти у нашому довіднику «input_print», а для обрахування середнього арифметичного, хто забув, треба суму елементів поділити на їх кількість, в python це просто sum(lst)/len(lst).
ps. Якщо ваші батьки збираються на батьківські збори і у вас є список всіх ваших оцінок, то що буде з даним списком після такого:
otsynky = [x for x in otsynky if 10 <= x <= 12]
Ну і додаткове питання – що буде, коли вас піймають? :)