Python · Синтаксис · Початковий рівень
Методи списків та кортежів
Освойте всі методи списків і зрозумійте ключові відмінності між списками і кортежами.
Короткий вступ до теми та пояснення перед вправами (вправи нижче):
Кортежі та розпакування
#Довідник: методи списків та кортежів
#Вправи:
append vs extend
#У вас є список `result = [1, 2, 3]`. Напишіть два окремих вирази: 1. Використайте `append`, щоб додати список `[4, 5]` як один елемент. 2. Починаючи знову від `[1, 2, 3]`, використайте `extend`, щоб додати `[4, 5]` як окремі елементи. Виведіть обидва результати і поясніть різницю.
result = [1, 2, 3] # 1. Використайте append, щоб додати [4, 5] як ОДИН елемент # 2. Почніть знову і використайте extend, щоб додати [4, 5] як ОКРЕМІ елементи result2 = [1, 2, 3]
Рішення
result = [1, 2, 3]
result.append([4, 5])
print(result) # [1, 2, 3, [4, 5]] — вкладений список
result2 = [1, 2, 3]
result2.extend([4, 5])
print(result2) # [1, 2, 3, 4, 5] — окремі елементи
Вставка на позицію
#Напишіть функцію `insert_after(lst, target, value)`, яка вставляє `value` одразу після першого входження `target` у `lst`. Якщо `target` не знайдено, додайте `value` у кінець. Приклад: `insert_after([1, 2, 4, 5], 2, 3)` → `[1, 2, 3, 4, 5]`.
def insert_after(lst, target, value):
pass
print(insert_after([1, 2, 4, 5], 2, 3)) # [1, 2, 3, 4, 5]
print(insert_after([1, 2, 3], 99, 0)) # [1, 2, 3, 0]
Рішення
def insert_after(lst, target, value):
result = lst[:]
if target in result:
idx = result.index(target)
result.insert(idx + 1, value)
else:
result.append(value)
return result
print(insert_after([1, 2, 4, 5], 2, 3)) # [1, 2, 3, 4, 5]
print(insert_after([1, 2, 3], 99, 0)) # [1, 2, 3, 0]
Видалити дублікати (зі збереженням порядку)
#Напишіть функцію `remove_dupes(lst)`, яка видаляє дублікати зі списку, зберігаючи порядок першої появи елементів. Приклад: `remove_dupes([3, 1, 2, 1, 3, 4])` → `[3, 1, 2, 4]`. Не використовуйте множини напряму (вони не зберігають порядок).
def remove_dupes(lst):
pass
print(remove_dupes([3, 1, 2, 1, 3, 4])) # [3, 1, 2, 4]
print(remove_dupes([1, 1, 1])) # [1]
Рішення
def remove_dupes(lst):
seen = set()
result = []
for item in lst:
if item not in seen:
seen.add(item)
result.append(item)
return result
print(remove_dupes([3, 1, 2, 1, 3, 4])) # [3, 1, 2, 4]
print(remove_dupes([1, 1, 1])) # [1]
Сортування за ключем
#Напишіть функцію `sort_by_length(words)`, яка повертає новий список слів, відсортованих за довжиною (спочатку найкоротші). Слова однакової довжини мають зберігати відносний порядок. Приклад: `sort_by_length(["banana", "fig", "apple", "kiwi"])` → `["fig", "kiwi", "apple", "banana"]`.
def sort_by_length(words):
pass
print(sort_by_length(["banana", "fig", "apple", "kiwi"]))
# ["fig", "kiwi", "apple", "banana"]
Рішення
def sort_by_length(words):
return sorted(words, key=len)
print(sort_by_length(["banana", "fig", "apple", "kiwi"]))
# ["fig", "kiwi", "apple", "banana"]
Стек на основі списку
#Реалізуйте простий стек на основі списку. Напишіть клас `Stack` з методами: `push(item)`, `pop()` (повертає і видаляє верхній елемент), `peek()` (повертає верхній елемент без видалення), `is_empty()`, `size()`. Використовуйте тільки методи списку — імпорт не потрібен.
class Stack:
def __init__(self):
self._data = []
def push(self, item):
pass
def pop(self):
pass
def peek(self):
pass
def is_empty(self):
pass
def size(self):
pass
s = Stack()
s.push(1)
s.push(2)
s.push(3)
print(s.peek()) # 3
print(s.pop()) # 3
print(s.size()) # 2
print(s.is_empty()) # False
Рішення
class Stack:
def __init__(self):
self._data = []
def push(self, item):
self._data.append(item)
def pop(self):
return self._data.pop()
def peek(self):
return self._data[-1]
def is_empty(self):
return len(self._data) == 0
def size(self):
return len(self._data)
s = Stack()
s.push(1)
s.push(2)
s.push(3)
print(s.peek()) # 3
print(s.pop()) # 3
print(s.size()) # 2
print(s.is_empty()) # False
Безпечна копія
#Наступний код містить помилку. Виправте його так, щоб зміна `b` не впливала на `a`: ```python a = [1, 2, 3] b = a b.append(99) print(a) # має залишитись [1, 2, 3] ``` Поясніть у коментарі, чому оригінальний код не працює.
a = [1, 2, 3] b = a # ПОМИЛКА: обидва вказують на один список b.append(99) print(a) # має бути [1, 2, 3], але виводить [1, 2, 3, 99] # Виправте код вище щоб зміна b не впливала на a
Рішення
a = [1, 2, 3]
b = a.copy() # створює новий незалежний список
b.append(99)
print(a) # [1, 2, 3] — без змін
print(b) # [1, 2, 3, 99]
# Альтернативи: b = a[:] або b = list(a)
Розпакування кортежів
#Напишіть функцію `swap(a, b)`, яка повертає два значення у зворотному порядку, використовуючи розпакування кортежу в один рядок. Потім напишіть функцію `unpack_first_last(lst)`, яка повертає кортеж `(first, last)` за допомогою зіркового розпакування. Приклад: `unpack_first_last([10, 20, 30, 40])` → `(10, 40)`.
def swap(a, b):
pass
def unpack_first_last(lst):
pass
print(swap(1, 2)) # (2, 1)
print(unpack_first_last([10, 20, 30, 40])) # (10, 40)
Рішення
def swap(a, b):
return b, a
def unpack_first_last(lst):
first, *_, last = lst
return first, last
print(swap(1, 2)) # (2, 1)
print(unpack_first_last([10, 20, 30, 40])) # (10, 40)
Пошук індексу без помилок
#Напишіть функцію `find_index(lst, value)`, яка повертає індекс `value` у `lst`, або `-1` якщо не знайдено. НЕ використовуйте `.index()` напряму (він кидає ValueError). Приклад: `find_index([10, 20, 30], 20)` → `1`, `find_index([10, 20, 30], 99)` → `-1`.
def find_index(lst, value):
pass
print(find_index([10, 20, 30], 20)) # 1
print(find_index([10, 20, 30], 99)) # -1
Рішення
def find_index(lst, value):
try:
return lst.index(value)
except ValueError:
return -1
print(find_index([10, 20, 30], 20)) # 1
print(find_index([10, 20, 30], 99)) # -1
Найчастіший елемент
#Напишіть функцію `most_frequent(lst)`, яка повертає елемент, що зустрічається найчастіше у списку. Якщо є рівність — повертайте той, що з'явився першим. Приклад: `most_frequent([1, 2, 2, 3, 1, 2])` → `2`, `most_frequent([5, 5, 3, 3])` → `5`.
def most_frequent(lst):
pass
print(most_frequent([1, 2, 2, 3, 1, 2])) # 2
print(most_frequent([5, 5, 3, 3])) # 5 (перший при рівності)
Рішення
def most_frequent(lst):
counts = {}
for item in lst:
counts[item] = counts.get(item, 0) + 1
return max(lst, key=lambda x: counts[x])
print(most_frequent([1, 2, 2, 3, 1, 2])) # 2
print(most_frequent([5, 5, 3, 3])) # 5 (перший при рівності)
Вирівняти на один рівень
#Напишіть функцію `flatten(lst)`, яка приймає список списків і повертає один плоский список з усіма елементами. Приклад: `flatten([[1, 2], [3, 4], [5]])` → `[1, 2, 3, 4, 5]`. Використовуйте `extend` або генератор списку.
def flatten(lst):
pass
print(flatten([[1, 2], [3, 4], [5]])) # [1, 2, 3, 4, 5]
print(flatten([[10, 20], [30], [40, 50]])) # [10, 20, 30, 40, 50]
Рішення
def flatten(lst):
result = []
for sub in lst:
result.extend(sub)
return result
# Однорядковий варіант:
def flatten_v2(lst):
return [x for sub in lst for x in sub]
print(flatten([[1, 2], [3, 4], [5]])) # [1, 2, 3, 4, 5]
print(flatten([[10, 20], [30], [40, 50]])) # [10, 20, 30, 40, 50]