Абстракція списків (List Comprehension) в Python

 Абстракція списків (або “спискове включення”, англ. “List Comprehension”) — це спосіб визначення та створення списків на основі існуючих списків. Синтаксис абстракції списків в Python наступний:

[вираз for елемент in список]

Приклади абстракції списків

Припустимо, ми хочемо розділити літери слова human і додати їх як елементи списку. Перше, що спадає на думку — це використати цикл for.

Приклад №1: Ітерація по рядку за допомогою циклу for:

Коли ми запустимо програму, результатом буде:

['h', 'u', 'm', 'a', 'n']

Однак в Python є простіший спосіб розв’язати цю проблему — використати абстракцію списків.

Подивимося, як вищенаведена програма може бути переписана з використанням абстракції списків.

Приклад №2: Ітерація по рядку за допомогою абстракції списків:

Коли ми запустимо програму, результатом буде:

['h', 'u', 'm', 'a', 'n']

Тут змінній h_letters присвоюється новий список, який містить елементи ітерованого рядка 'human'. Якщо ви помітили, 'human' — це рядок, а не список. У цьому полягає сила абстракції списків. Вона може визначити, коли отримує рядок або кортеж, і працювати з цим об’єктом як зі списком.

Абстракція списків vs. Лямбда-функції

Абстракція списків не є єдиним способом роботи зі списками. Різні вбудовані функції та лямбда-функції дозволяють створювати та змінювати списки за меншу кількість рядків коду.

Приклад №3: Використання лямбда-функцій всередині списку:

Результат:

['h','u','m','a','n']

Зазвичай абстракція списків більш читабельна, ніж лямбда-функції. Легше зрозуміти, що хоче зробити програміст.

Умови в абстракції списків

В абстракції списків можна використовувати умови для зміни існуючого списку (або інших кортежів).

Приклад №4: Використання if в абстракції списків:

Результат:

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Список number_list буде заповнено елементами в діапазоні від 0 до 19, якщо значення елемента ділиться на 2.

Приклад №5: Вкладений if в абстракції списків:

Результат:

[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

Тут абстракція списків перевіряє:

  1. Чи ділиться y на 2, чи ні?
  2. Чи ділиться y на 5, чи ні?

Якщо y задовольняє обом умовам, y додається до списку num_list.

Приклад №6: if…else в абстракції списків:

Результат:

['Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd']

Тут абстракція списків перевіряє 10 чисел від 0 до 9. Якщо i ділиться на 2, то в список obj додається Even. Якщо ні, то додається Odd.

Вкладені цикли в абстракції списків

Припустимо, нам потрібно обчислити транспонування матриці, що потребує використання вкладеного циклу for.

Приклад №7: Транспонування матриці за допомогою циклів for:

Результат:

[[1, 4], [2, 5], [3, 6], [4, 8]]

Тут використовуються два цикли для знаходження транспонування матриці. Ми також можемо виконувати вкладені ітерації всередині списку. А зараз спробуємо знайти транспонування матриці за допомогою вкладеного циклу всередині абстракції списків.

Приклад №8: Транспонування матриці за допомогою абстракції списків:

Результат:

[[1, 3, 5, 7], [2, 4, 6, 8]]

У нас є змінна matrix, яка має 4 рядки та 2 стовпця. Нам потрібно знайти транспонування matrix. Для цього ми використали абстракцію списків.

Примітка: Вкладені цикли в абстракції списків працюють не так, як звичайні вкладені цикли. У вищенаведеній програмі цикл for i in range(2) виконується до row[i] for row in matrix. Отже, спочатку змінній i присвоюється значення, а потім елемент, на який вказує row[i], додається в змінну transpose.

Коментарі