Списки (List), методи та list comprehensions¶
Довідник. Ноутбук уроку, де списки й кортежі з'являються вперше в контексті задачі, — Урок 5.
1. Що таке список концептуально?¶
Уявіть список як безрозмірний контейнер або потяг, до якого можна під час руху чіпляти нові вагони, відчіпляти старі, міняти їх місцями або заглядати всередину будь-якого з них.
Списки в Python забезпечують підтримку впорядкованих колекцій інших об'єктів. Вони можуть містити елементи абсолютно різних типів (числа, рядки, інші списки тощо), і за необхідності автоматично збільшуватися або зменшуватися в розмірах.
Головна роль списку — накопичення даних. Коли програма читає рядки з текстового файлу, збирає статистику з датчиків, отримує відповіді від користувача або парсить веб-сайт, вона зазвичай складає всі ці шматочки інформації саме в список, щоб потім обробити їх усі разом.
2. Змінність (mutability) — головна суперсила списків¶
Рядки (str) та кортежі (tuple) є незмінними. Якщо ви хочете змінити рядок, Python створює в пам'яті абсолютно новий рядок. Списки (list) — це змінний (mutable) тип даних: ви можете змінювати вміст списку (додавати, видаляти, переписувати елементи) безпосередньо в тій самій ділянці пам'яті, де він був створений.
Чому це важливо розуміти (пастка з посиланнями)¶
У Python змінні не зберігають самі списки безпосередньо, вони зберігають лише посилання на них. Оскільки список змінюється "на місці", це призводить до такого ефекту:
a = [1, 2, 3] # Створюємо список
b = a # Змінна 'b' починає вказувати на ТОЙ САМИЙ список, що й 'a'
a.append(4) # Ми змінюємо список через 'a'
print(b) # 'b' теж змінилося!
Результат:
Саме тому списки ідеальні для накопичення: можна передати список у функцію, функція додасть туди нові дані, і ці зміни миттєво стануть доступними усій програмі.
3. Базове створення та індексація¶
- Створення: списки створюються за допомогою квадратних дужок
[]або вбудованої функціїlist(). - Індексація: нумерація елементів починається з нуля, підтримуються від'ємні індекси та зрізи.
empty_list = []
mixed_list = ['uno', 2, 'tre', 4.0] # список з різними типами даних
print(mixed_list)
Результат:
4. Основні методи списків (для управління та накопичення)¶
Розширення та вставка (накопичення)¶
| Метод | Опис | Коли використовувати |
|---|---|---|
append(x) |
Додає елемент x у кінець списку. Мутує список на місці, повертає None. |
Динамічне формування даних у циклах for/while. |
extend(iterable) |
На відміну від append, бере іншу послідовність (список, рядок) і додає кожен її елемент по черзі в кінець. |
Злиття масивів даних. |
insert(index, item) |
Вставляє елемент на вказану позицію; наступні елементи зсуваються вправо. | Коли дані треба додати не в кінець, а в конкретне місце (наприклад, термінове завдання на початок черги). |
# append
cars = ['Toyota', 'BMW']
cars.append('Audi')
print("Append:", cars)
# extend
cart = ['яблуко', 'банан']
new_items = ['ківі', 'манго']
cart.extend(new_items)
print("Extend:", cart)
# insert
queue = ['Олег', 'Анна']
queue.insert(0, 'Бос')
print("Insert:", queue)
Результат:
Append: ['Toyota', 'BMW', 'Audi']
Extend: ['яблуко', 'банан', 'ківі', 'манго']
Insert: ['Бос', 'Олег', 'Анна']
Видалення елементів (очищення даних)¶
| Метод | Опис | Коли використовувати |
|---|---|---|
remove(item) |
Шукає перше входження значення item і видаляє його. Якщо елемента немає — ValueError. |
Видалення конкретного об'єкта, коли відоме що видалити, але не відоме де воно лежить. |
pop([index]) |
Видаляє елемент за індексом і повертає його. Без індексу — видаляє й повертає останній. | Основа для "стеків"/"черг": одночасно забираєте дані й починаєте з ними працювати. |
clear() |
Повністю очищає список — стає []. |
Коли дані накопичені й оброблені, потрібен чистий контейнер для наступної порції. |
# remove
colors = ['red', 'blue', 'green', 'blue']
colors.remove('blue')
print("Remove:", colors)
# pop
tasks = ['Task1', 'Task2']
current_task = tasks.pop()
print("Pop повернув:", current_task)
print("Залишилось у tasks:", tasks)
# clear
tasks.clear()
print("Clear:", tasks)
Результат:
Пошук та аналіз¶
| Метод | Опис |
|---|---|
index(item, [start, end]) |
Повертає індекс (позицію) першого входження елемента. |
count(item) |
Підраховує, скільки разів елемент зустрічається у списку. |
data = ['a', 'b', 'c', 'b', 'b']
print("Index of 'c':", data.index('c'))
print("Count of 'b':", data.count('b'))
Результат:
Впорядкування (мутація "на місці")¶
sort(key=None, reverse=False)— сортує список. На відміну від функціїsorted(), яка створює новий список, метод.sort()змінює сам список (in-place) і повертаєNone.reverse()— розвертає порядок елементів на місці.
# sort
prices = [150, 20, 99, 5]
prices.sort(reverse=True) # за спаданням
print("Sort:", prices)
# reverse
items = [1, 2, 3]
items.reverse()
print("Reverse:", items)
Результат:
5. List comprehensions¶
List comprehension — елегантний і швидкий спосіб створення нового списку з ітерованого об'єкта шляхом застосування виразу до кожного елемента та/або фільтрації. Це "синтаксичний цукор", який дозволяє замінити громіздкі цикли for з append() одним читабельним рядком коду.
Загальний синтаксис: [вираз for змінна in ітерований_об'єкт if умова]
Використання:
- трансформація даних — зміна кожного елемента списку (аналог
map()); - фільтрація даних — вибір елементів, що відповідають умові (аналог
filter()); - оптимізація — працює швидше за звичайний цикл
forзappend(), бо оптимізовано на рівні C.
А. Трансформація (заміна for + append)¶
Результат: Doubled: [2, 4, 6]
Б. Фільтрація (використання if)¶
Результат: Evens: [2, 4, 6]
В. Робота з рядками¶
words = ["Apple", "Banana", "Cherry"]
first_letters = [word[0] for word in words]
print("First letters:", first_letters)
Результат: First letters: ['A', 'B', 'C']
Г. Декартовий добуток (вкладені цикли for)¶
colors = ['red', 'blue']
items = ['car', 'pen']
combinations = [f"{c} {i}" for c in colors for i in items]
print("Combinations:", combinations)
Результат:
Підсумок: що обрати?¶
Список у Python — це головний інструмент для збору інформації під час роботи програми. Починаєте з порожнього списку data = [], накопичуєте туди дані через append() або extend(), за необхідності чистите через remove(), і сортуєте через sort() перед тим, як віддати результат.
- List comprehension — коли потрібно створити новий список на основі існуючого. Це "пітонівський" (Pythonic), читабельний і швидкий код.
append()у цикліfor— коли логіка всередині циклу занадто складна (наприклад, міститьif/elif/else,try/exceptабо роботу з базами даних). Якщо comprehension важко читається — поверніться до класичногоappend().
Дивись також: Кортежі та namedtuple · Множини · Словники