List comprehension (спискове включення) у Python – це зручний спосіб створити новий список, шляхом перебору елементів іншого ітерованого об’єкта (наприклад списку, кортежу, множини), та застосування до них операції перетворення або фільтрації за умовою.
Синтаксис list comprehension
new_list = [expression for item in iterable if condition]- expression – вираз, який обчислюється для кожного елемента (наприклад x * 2)
- item – змінна, що послідовно приймає значення з iterable
- iterable – будь-який об’єкт, що підтримує ітерацію
- condition (необов’язково) – логічна умова для фільтрації елементів
Базовий приклад list comprehension
Припустимо, що є список чисел, і потрібно створити новий список, який містить квадрати цих чисел:
numbers = [1, 2, 3, 4, 5]
squares = [n ** 2 for n in numbers]
print(squares) # [1, 4, 9, 16, 25]List comprehension з умовами
У list comprehension можна додати умову наприкінці виразу, щоб відібрати лише ті елементи, які потрібно включити до нового списку. Наприклад, можна створити список, що містить тільки парні числа з початкового списку:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = [n for n in numbers if n % 2 == 0]
print(evens) # [2, 4, 6, 8, 10]Вкладені list comprehension
List comprehension у Python можна вкладати один в один. Це дозволяє обробляти складні структури даних, наприклад матриці (списки списків), або створювати нові списки на основі кількох рівнів ітерацій.
Наприклад, якщо у вас є матриця, ви можете розпакувати її в один плоский список, який міститиме всі елементи матриці:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
numbers = [element for row in matrix for element in row]
print(numbers)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]У цьому прикладі:
- for row in matrix – перебираємо кожен рядок у матриці
- for element in row – для кожного рядка перебираємо всі його елементи
- element – додаємо кожен знайдений елемент до нового списку numbers
List comprehension з кількома умовами
У list comprehension можна додавати більше ніж одну умову, щоб фільтрувати елементи за кількома критеріями одночасно.
Наприклад, потрібно створити список, що містить лише парні числа, більші за 4, з початкового списку:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = [n for n in numbers if n % 2 == 0 and n > 4]
print(even_numbers) # [6, 8, 10]Потенційні недоліки використання list comprehension
Хоча list comprehension – це потужний інструмент у Python, його не варто використовувати завжди. Ось кілька можливих недоліків:
- Складність: Якщо спискове включення містить декілька вкладених циклів або умов, код може стати важким для розуміння. У таких випадках краще віддати перевагу традиційним циклам.
- Читабельність: Лаконічність – перевага list comprehension, але у складних конструкціях вона може знизити читабельність коду. Пріоритетом завжди мають бути простота і зрозумілість.
Порівняння циклу for з list comprehension у Python
Щоб побачити різницю в синтаксисі, розглянемо приклад, який показує, як виглядає традиційний цикл for у порівнянні з list comprehension:
Традиційний цикл for:
numbers = [1, 2, 3, 4, 5]
squares = []
for n in numbers:
squares.append(n ** 2)
print(squares) # [1, 4, 9, 16, 25]List comprehension:
numbers = [1, 2, 3, 4, 5]
squares = [n ** 2 for n in numbers]
print(squares) # [1, 4, 9, 16, 25]Обидва фрагменти коду виконують одну й ту саму задачу, але варіант з list comprehension виглядає більш стислим і лаконічним.