Абстракція списків (або “спискове включення”, англ. “List Comprehension”) — це спосіб визначення та створення списків на основі існуючих списків. Синтаксис абстракції списків в Python наступний:
[вираз for елемент in список]
Приклади абстракції списків
Припустимо, ми хочемо розділити літери слова human
і додати їх як елементи списку. Перше, що спадає на думку — це використати цикл for.
Приклад №1: Ітерація по рядку за допомогою циклу for:
h_letters = [] for letter in 'human': h_letters.append(letter) print(h_letters) |
Коли ми запустимо програму, результатом буде:
['h', 'u', 'm', 'a', 'n']
Однак в Python є простіший спосіб розв’язати цю проблему — використати абстракцію списків.
Подивимося, як вищенаведена програма може бути переписана з використанням абстракції списків.
Приклад №2: Ітерація по рядку за допомогою абстракції списків:
h_letters = [ letter for letter in 'human' ] print( h_letters) |
Коли ми запустимо програму, результатом буде:
['h', 'u', 'm', 'a', 'n']
Тут змінній h_letters
присвоюється новий список, який містить елементи ітерованого рядка 'human'
. Якщо ви помітили, 'human'
— це рядок, а не список. У цьому полягає сила абстракції списків. Вона може визначити, коли отримує рядок або кортеж, і працювати з цим об’єктом як зі списком.
Абстракція списків vs. Лямбда-функції
Абстракція списків не є єдиним способом роботи зі списками. Різні вбудовані функції та лямбда-функції дозволяють створювати та змінювати списки за меншу кількість рядків коду.
Приклад №3: Використання лямбда-функцій всередині списку:
letters = list(map(lambda x: x, 'human')) print(letters) |
Результат:
['h','u','m','a','n']
Зазвичай абстракція списків більш читабельна, ніж лямбда-функції. Легше зрозуміти, що хоче зробити програміст.
Умови в абстракції списків
В абстракції списків можна використовувати умови для зміни існуючого списку (або інших кортежів).
Приклад №4: Використання if в абстракції списків:
number_list = [ x for x in range(20) if x % 2 == 0] print(number_list) |
Результат:
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Список number_list
буде заповнено елементами в діапазоні від 0 до 19, якщо значення елемента ділиться на 2.
Приклад №5: Вкладений if в абстракції списків:
num_list = [y for y in range(100) if y % 2 == 0 if y % 5 == 0] print(num_list) |
Результат:
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
Тут абстракція списків перевіряє:
- Чи ділиться
y
на 2, чи ні? - Чи ділиться
y
на 5, чи ні?
Якщо y
задовольняє обом умовам, y
додається до списку num_list
.
Приклад №6: if…else в абстракції списків:
obj = ["Even" if i%2==0 else "Odd" for i in range(10)] print(obj) |
Результат:
['Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd']
Тут абстракція списків перевіряє 10 чисел від 0 до 9. Якщо i
ділиться на 2, то в список obj
додається Even
. Якщо ні, то додається Odd
.
Вкладені цикли в абстракції списків
Припустимо, нам потрібно обчислити транспонування матриці, що потребує використання вкладеного циклу for.
Приклад №7: Транспонування матриці за допомогою циклів for:
transposed = [] matrix = [[1, 2, 3, 4], [4, 5, 6, 8]] for i in range(len(matrix[0])): transposed_row = [] for row in matrix: transposed_row.append(row[i]) transposed.append(transposed_row) print(transposed) |
Результат:
[[1, 4], [2, 5], [3, 6], [4, 8]]
Тут використовуються два цикли для знаходження транспонування матриці. Ми також можемо виконувати вкладені ітерації всередині списку. А зараз спробуємо знайти транспонування матриці за допомогою вкладеного циклу всередині абстракції списків.
Приклад №8: Транспонування матриці за допомогою абстракції списків:
matrix = [[1, 2], [3,4], [5,6], [7,8]] transpose = [[row[i] for row in matrix] for i in range(2)] print (transpose) |
Результат:
[[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
.
Коментарі
Дописати коментар