У цій статті ми дізнаємося про розуміння списку Python та про те, як ним користуватися.
Список розуміння проти For Loop у Python
Припустимо, ми хочемо відокремити букви слова human
та додати літери як елементи списку. Перше, що спадає на думку, це використання циклу for.
Приклад 1: Ітерація через рядок, використовуючи для циклу
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'. Ми викликаємо print()
функцію для отримання вихідних даних.
Синтаксис розуміння списку
(вираз для елемента у списку)
Тепер ми можемо визначити, де використовуються розуміння списків.
Якщо ви помітили, human
це рядок, а не список. У цьому полягає сила розуміння списку. Він може визначити, коли він отримує рядок або кортеж, і працювати над ним, як список.
Ви можете зробити це за допомогою петель. Однак не кожен цикл можна переписати як розуміння списку. Але коли ви навчитесь і почуватиметесь зручно зі сприйняттям списків, ви виявите, що замінюєте все більше і більше циклів цим елегантним синтаксисом.
Список розумінь проти функцій лямбда
Розуміння списків - не єдиний спосіб роботи зі списками. Різні вбудовані функції та лямбда-функції можуть створювати та модифікувати списки з меншим числом рядків коду.
Приклад 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)
Коли ми запускаємо вищезазначену програму, результат буде:
('Парне', 'непарне', 'парне', 'непарне', 'парне', 'непарне', 'парне', 'непарно', 'парне', 'непарно')
Here, list comprehension will check the 10 numbers from 0 to 9. If i is divisible by 2, then Even
is appended to the obj list. If not, Odd
is appended.
Nested Loops in List Comprehension
Suppose, we need to compute the transpose of a matrix that requires nested for loop. Let’s see how it is done using normal for loop first.
Example 7: Transpose of Matrix using Nested Loops
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)
Output
((1, 4), (2, 5), (3, 6), (4, 8))
The above code use two for loops to find transpose of the matrix.
We can also perform nested iteration inside a list comprehension. In this section, we will find transpose of a matrix using nested loop inside list comprehension.
Example 8: Transpose of a Matrix using List Comprehension
matrix = ((1, 2), (3,4), (5,6), (7,8)) transpose = ((row(i) for row in matrix) for i in range(2)) print (transpose)
When we run the above program, the output will be:
((1, 3, 5, 7), (2, 4, 6, 8))
In above program, we have a variable matrix which have 4
rows and 2
columns.We need to find transpose of the matrix. For that, we used list comprehension.
**Note: The nested loops in list comprehension don’t work like normal nested loops. In the above program, for i in range(2)
is executed before row(i) for row in matrix
. Hence at first, a value is assigned to i then item directed by row(i)
is appended in the transpose variable.
Key Points to Remember
- List comprehension is an elegant way to define and create lists based on existing lists.
- List comprehension is generally more compact and faster than normal functions and loops for creating list.
- However, we should avoid writing very long list comprehensions in one line to ensure that code is user-friendly.
- Пам'ятайте, кожне розуміння списку можна переписати у цикл for, але кожен цикл for не можна переписати у формі розуміння списку.