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 виглядає більш стислим і лаконічним.


Мітки: