Python · Синтаксис · Початковий рівень

Цикл for, списки та кортежи

15 завдань

Практика циклу for Python на списках і кортежах: перебір колекцій, фільтрація значень, підрахунки, пошук мінімуму і максимуму, робота з строками, датами і вкладеними даними.

Цикл for і ітеровані об'єкти

#
Цикл for обходить кожен елемент ітерованого об'єкта — списку, кортежу, рядка або будь-якої послідовності — по одному. Лічильником керувати вручну не потрібно: Python обробляє кроки сам. ```python numbers = [3, 7, 1, 9, 4] for n in numbers: print(n) ``` На кожній ітерації n прив'язується до наступного елемента списку. Коли список закінчується — цикл завершується. Та сама синтаксична форма працює з кортежами і рядками — рядки ітеруються символ за символом. Відмінність від while — у намірі. Використовуйте for, коли знаєте, що саме ітеруєте. Використовуйте while, коли кількість ітерацій залежить від умови, що обчислюється під час виконання. enumerate дає і індекс, і значення, коли вони потрібні разом: ```python days = ("Monday", "Tuesday", "Wednesday") for i, day in enumerate(days, start=1): print(f"День {i}: {day}") ``` Без enumerate потрібна була б окрема змінна-лічильник — enumerate прибирає цей зайвий код.

Побудова колекцій під час ітерації

#
Багато завдань із for мають однакову форму: починаємо з порожнього списку, проходимо по джерелу, вирішуємо, чи включати кожен елемент, і додаємо обраних. ```python numbers = [2, 5, 0, 8, 11, 14, 17, 0] result = [] for n in numbers: if n % 2 == 0 and n != 0: result.append(n) print(result) ``` Додавання до списку всередині циклу — стандартний патерн фільтрації. append виконується за O(1) — він не копіює список кожного разу. Накопичення суми працює так само, тільки замість списку використовується число: ```python numbers = [5, 10, 15, 20] total = 0 for n in numbers: total += n print(total) ``` Відстеження поточного максимуму — починаємо з першого елемента як початкового припущення, потім оновлюємо, коли знаходимо щось більше: ```python numbers = [8, 3, 15, 6, 2] max_num = numbers[0] for n in numbers: if n > max_num: max_num = n print(max_num) ``` Починати з numbers[0], а не з 0, важливо. Якщо всі числа від'ємні, початок з 0 дав би неправильну відповідь.

Ключові патерни із завдань

#
Побудова рядка через з'єднання елементів списку — замість того щоб дописувати до рядка всередині циклу (що створює новий рядок кожного разу), збираємо елементи і з'єднуємо в кінці: ```python numbers = [3, 7, 1, 9, 4] result = "-".join(str(n) for n in numbers) print(result) # 3-7-1-9-4 ``` str(n) перетворює кожне ціле число на рядок перед з'єднанням. join вимагає, щоб усі елементи вже були рядками. Побудова списку кортежів — поєднуємо кожен елемент з обчисленими даними: ```python words = ["Python", "is", "cool"] result = [] for word in words: result.append((word, len(word))) print(result) # [('Python', 6), ('is', 2), ('cool', 4)] ``` Фільтрація за властивістю рядка: ```python words = ["python", "java", "go", "javascript", "c"] count = 0 for word in words: if len(word) > 5: count += 1 print(count) ``` Розбір структурованих даних — розбиваємо по роздільнику, потім порівнюємо частини. Завдання на фільтрацію дат за цією ж схемою: порівнюємо частини рядка дати (рік, місяць, день) із порогом.

Швидкий довідник: цикл for, списки та кортежі

#
**Синтаксис циклу for** ```python for елемент in ітерований: # список, кортеж, рядок, range # тіло # з індексом — використовувати enumerate for i, елемент in enumerate(items): # i починається з 0 for i, елемент in enumerate(items, start=1): # i починається з 1 # за індексом — використовувати range for i in range(5): # 0, 1, 2, 3, 4 for i in range(1, 6): # 1, 2, 3, 4, 5 for i in range(0, 10, 2): # 0, 2, 4, 6, 8 (крок=2) ``` **Швидкий довідник по кортежу** ```python point = (3, 7) # створення з дужками point[0] # доступ за індексом — як список x, y = point # розпакування у змінні len(point) # 2 # кортежи незмінні — point[0] = 5 викличе TypeError ``` **Типові паттерни циклу for** | Патерн | Шаблон | |---|---| | Фільтрація у новий список | `result = []; for x in xs: if умова: result.append(x)` | | Сума / накопичення | `total = 0; for x in xs: total += x` | | Підрахунок збігів | `count = 0; for x in xs: if умова: count += 1` | | Знайти макс / мін | `m = xs[0]; for x in xs: if x > m: m = x` | | Побудова рядка | `result = ''.join(str(x) for x in xs)` | | Список кортежів | `result.append((x, обчислене))` | **Корисні вбудовані функції що замінюють ручні цикли** ```python sum([1, 2, 3]) # 6 max([3, 1, 4]) # 4 min([3, 1, 4]) # 1 len([1, 2, 3]) # 3 sorted([3, 1, 2]) # [1, 2, 3] '-'.join(['a', 'b']) # 'a-b' ```
01

Числа через дефіс.

#

Дано список чисел. Виведіть кожне число зі списку в тому ж рядку в терміналі через дефіс. 3-7-1-9-4

numbers = [3, 7, 1, 9, 4]

Рішення
numbers = [3, 7, 1, 9, 4]

result = ""
for n in numbers:
    result += str(n) + "-"

result = result[:-1]
print(result)

# або
numbers = [3, 7, 1, 9, 4]

for n in numbers[:-1]:
    print(n, end="-")
print(numbers[-1])

# або найкоротший варіант через join
numbers = [3, 7, 1, 9, 4]

result = "-".join(str(n) for n in numbers)
print(result)
02

Парні числа без нулів.

#

Дано список чисел. Додайте в новий список тільки парні числа, нулі пропустити.

numbers = [2, 5, 0, 8, 11, 14, 17, 0]
new = []

Рішення
numbers = [2, 5, 0, 8, 11, 14, 17, 0]
new = []

for n in numbers:
    if n != 0 and n % 2 == 0:
        new.append(n)

print(new)

# або так можна: спочатку перевірити нуль, а потім парність
numbers = [2, 5, 0, 8, 11, 14, 17, 0]
new = []

for n in numbers:
    if n == 0:
        continue
    if n % 2 == 0:
        new.append(n)

print(new)
03

Сума елементів списку.

#

Дано список чисел. Знайдіть суму всіх елементів списку.

numbers = [5, 10, 15, 20]

total = 0
Рішення
numbers = [5, 10, 15, 20]

total = 0
for n in numbers:
    total += n

print("Сума:", total)

# або
numbers = [5, 10, 15, 20]

total = sum(numbers)

print("Сума:", total)
04

Непорожні рядки.

#

Дано список рядків. Додайте в новий список рядки, якщо вони не порожні.

words = ["0000-0000-0000-0000", "", "1111-1111-1111-1111", "2222-2222-2222-2222", ""]
new_words = []

Рішення
words = ["0000-0000-0000-0000", "", "1111-1111-1111-1111", "2222-2222-2222-2222", ""]
new_words = []

for w in words:
    if w != "":
        new_words.append(w)

print(new_words)

# або

words = ["0000-0000-0000-0000", "", "1111-1111-1111-1111", "2222-2222-2222-2222", ""]
new_words = []

for w in words:
    if w:
        new_words.append(w)

print(new_words)
05

Квадрати чисел більших за 10.

#

Дано список чисел. Створіть новий список, у якому будуть піднесені до квадрату тільки числа більші за 10.

numbers = [3, 12, 5, 18, 7, 25]

result = []
Рішення
numbers = [3, 12, 5, 18, 7, 25]

result = []
for n in numbers:
    if n > 10:
        result.append(n ** 2)

print(result)

# або так можна: спочатку зберегти квадрат у змінну
numbers = [3, 12, 5, 18, 7, 25]

result = []
for n in numbers:
    if n > 10:
        square = n ** 2
        result.append(square)

print(result)
06

Дні тижня з номерами.

#

Дано кортеж з назвами днів тижня. Виведіть кожен день у форматі: "День X: <назва>" .

days = ("Понеділок", "Вівторок", "Середа", "Четвер", "П’ятниця")

Рішення
days = ("Понеділок", "Вівторок", "Середа", "Четвер", "П’ятниця")

day_num = 1
for day in days:
    print(f"День {day_num}: {day}")
    day_num += 1

# або так можна через enumerate
days = ("Понеділок", "Вівторок", "Середа", "Четвер", "П’ятниця")

for number, day in enumerate(days, 1):
    print(f"День {number}: {day}")
07

Максимум через цикл.

#

Дано список чисел. Знайдіть максимальне число у списку, використовуючи цикл for .

numbers = [8, 3, 15, 6, 2]

max_num = numbers[0]
Рішення
numbers = [8, 3, 15, 6, 2]

max_num = numbers[0]
for n in numbers:
    if n > max_num:
        max_num = n

print("Максимум:", max_num)

# а взагалі, для цього є вбудована функція max:
numbers = [8, 3, 15, 6, 2]

max_num = max(numbers)
print("Максимум:", max_num)
08

Рядки довші за 5 символів.

#

Дано список рядків. Порахуйте, скільки рядків довші за 5 символів.

words = ["python", "java", "go", "javascript", "c"]

count = 0
Рішення
words = ["python", "java", "go", "javascript", "c"]

count = 0
for w in words:
    if len(w) > 5:
        count += 1

print("Кількість рядків:", count)

# або так можна: зберегти довжину в змінну
words = ["python", "java", "go", "javascript", "c"]

count = 0
for w in words:
    length = len(w)
    if length > 5:
        count += 1

print("Кількість рядків:", count)
09

Додатні числа з кортежу.

#

Дано кортеж чисел. Виведіть тільки ті числа, які більші за 0.

numbers = (-3, 5, -1, 7, 0, -2)

Рішення
numbers = (-3, 5, -1, 7, 0, -2)

for n in numbers:
    if n > 0:
        print(n)

# або так можна: додатні числа зібрати в новий список
numbers = (-3, 5, -1, 7, 0, -2)
positive = []

for n in numbers:
    if n > 0:
        positive.append(n)

print(positive)
10

Рядок через кому.

#

Дано список рядків. Створіть рядок, який буде складатися з усіх елементів списку, розділених комою та пробілом.

words = ["Python", "це", "круто"]

result = ""
Рішення
words = ["Python", "це", "круто"]

result = ""
for w in words:
    result += w + ", "

result = result[:-2]
print(result)

# або коротше через join
words = ["Python", "це", "круто"]

result = ", ".join(words)
print(result)
11

Слова та їх довжина.

#

А будьте такі ласкаві 🧐, створити з цього списку рядків новий список, у якому елементами будуть кортежі. У кожному кортежі два елементи: рядок і його довжина, наприклад: words = ["Python", "це", "круто"] new = [("Python", 6), ("це", 2), ("круто", 5)]

words = ["Python", "это", "круто"]
new = []

Рішення
words = ["Python", "це", "круто"]
new = []

for word in words:
    t = (word, len(word))
    new.append(t)

print(new)


# АБО те саме коротше:
words = ["Python", "це", "круто"]
new = []

for word in words:
    new.append((word, len(word)))

print(new)
12

Символи рядка в нижньому регістрі.

#

Хм... Терміново потрібно зробити з цього рядка "Цього", список, який буде складатися із символів цього рядка в нижньому регістрі!!! (маленькі букви)

word = "Цього"

Рішення
word = "Цього"

arr = list(word.lower())  # так, це все.

print(arr)

# або через цикл, щоб явно побачити додавання кожного символу
word = "Цього"
arr = []

for char in word:
    arr.append(char.lower())

print(arr)
13

Номер картки через дефіс.

#

Знову терміново! Якийсь розумник зберіг номер банківської картки у вигляді списку по 4 цифри картки: card = ["1111", "2222", "3333", "4444"] Зробіть із цього рядок у такому форматі: norm_card = "1111-2222-3333-4444"

card = ["1111", "2222", "3333", "4444"]

Рішення
card = ["1111", "2222", "3333", "4444"]

# Це терміново:
norm_card = "-".join(card)
print(norm_card)


# Це не терміново:
norm_card = ""

for part in card:
    norm_card += part + "-"
else:
    norm_card = norm_card[:-1]
print(norm_card)
14

Мінімум, максимум і середнє.

#

Продовжуємо терміновий квест! Знайдіть по швидкому: - мінімальне значення у списку; - максимальне значення у списку; - суму всіх значень у списку; - середнє арифметичне значень у списку. А потім, за бажанням, не по швидкому.

arr = [10, 100, 500, 11, 18, 99, -3, 101]

Рішення
arr = [10, 100, 500, 11, 18, 99, -3, 101]

# по швидкому:
mn = min(arr)
mx = max(arr)
sm = sum(arr)
am = sum(arr)/len(arr)
print(mn, mx, sm, am)


# не по швидкому:
mn = arr[0]
mx = arr[0]
sm = 0

for num in arr:
    sm += num
    if num < mn:
        mn = num
    if num > mx:
        mx = num

am = sm/len(arr)

print(mn, mx, sm, am)
15

Фільтр дат після 2027.09.01.

#

На останок, за 5 хвилин до кінця робочого дня потрібно: Є список з датами у чіткому форматі yyyy.mm.dd: dates = ["2027.09.25", "2027.10.14", "2027.03.01", "2027.12.29", "2027.09.11", "2027.05.06"] Потрібен новий список де будуть тільки дати після 2027.09.01. Підказка: спробуйте порівнювати рядки через < - > , іноді це корисно😉.

dates = ["2027.09.25", "2027.10.14", "2027.03.01", "2027.12.29", "2027.09.11", "2027.05.06"]
new = []
Рішення
dates = ["2027.09.25", "2027.10.14", "2027.03.01", "2027.12.29", "2027.09.11", "2027.05.06"]

new = []

for date in dates:
    if date >= "2027.09.01":
        new.append(date)

print(new)

Тут важливо розуміти, що рядки порівнюються лексикографічно - тобто не як числа дат, а просто як кожен окремий символ. І це один з рідкісних випадків, коли порівняння рядків через < > можна застосувати, окрім, звісно, сортування за алфавітом.
ВАЖЛИВО: формат дат має бути саме таким, інакше якщо записати dd.mm.yyyy це вже не буде працювати так як ми б хотіли.

# або так можна: зберегти межу в окрему змінну
dates = ["2027.09.25", "2027.10.14", "2027.03.01", "2027.12.29", "2027.09.11", "2027.05.06"]
border = "2027.09.01"
new_dates = []

for date in dates:
    if date > border:
        new_dates.append(date)

print(new_dates)