В тази статия ще научим за разбирането на списъка на Python и как да го използваме.
Списък на разбирането срещу за цикъл в Python
Да предположим, че искаме да отделим буквите на думата human
и да добавим буквите като елементи от списък. Първото нещо, което идва на ум, би било използването на цикъл.
Пример 1: Итерация през низ с помощта на Loop
h_letters = () for letter in 'human': h_letters.append(letter) print(h_letters)
Когато стартираме програмата, изходът ще бъде:
('човек')
Въпреки това, Python има по-лесен начин да реши този проблем, като използва разбирането на списъци. Разбирането на списъци е елегантен начин за дефиниране и създаване на списъци въз основа на съществуващи списъци.
Нека да видим как горната програма може да бъде написана с помощта на разбиране на списъка.
Пример 2: Итерация през низ с използване на разбиране на списъка
h_letters = ( letter for letter in 'human' ) print( h_letters)
Когато стартираме програмата, изходът ще бъде:
('човек')
В горния пример, нов списък се присвоява на променлива h_letters и списъкът съдържа елементите на итерируемия низ „човек“. Извикваме print()
функция, за да получим изхода.
Синтаксис на разбиране на списъка
(израз за елемент в списъка)
Вече можем да определим къде се използват разбирането на списъците.
Ако сте забелязали, това human
е низ, а не списък. Това е силата на разбирането на списъка. Той може да идентифицира кога получава низ или кортеж и да работи върху него като списък.
Можете да направите това с помощта на цикли. Не всеки цикъл обаче може да бъде пренаписан като разбиране на списъка. Но докато се учите и се чувствате добре с разбирането на списъка, ще откриете, че замествате все повече и повече цикли с този елегантен синтаксис.
Списък на разбирането срещу функциите на Lambda
Разбиранията на списъците не са единственият начин за работа със списъци. Различни вградени функции и ламбда функции могат да създават и модифицират списъци в по-малко редове код.
Пример 3: Използване на ламбда функции в списъка
letters = list(map(lambda x: x, 'human')) print(letters)
Когато стартираме програмата, изходът ще бъде
('човек')
Разбиранията на списъците обаче обикновено са по-четими от хората, отколкото ламбда функциите. По-лесно е да се разбере какво програмистът се е опитвал да постигне, когато се използват разбиране на списъка.
Условни в разбирането на списъка
Разбиранията на списъците могат да използват условни изрази, за да модифицират съществуващ списък (или други кортежи). Ще създадем списък, който използва математически оператори, цели числа и диапазон ().
Пример 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: ако … друго С разбиране на списъка
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 не може да бъде пренаписано под формата на разбиране на списъка.