В этой статье мы узнаем о понимании списков Python и о том, как его использовать.
Понимание списка и цикл For в Python
Предположим, мы хотим разделить буквы слова human
и добавить буквы как элементы списка. Первое, что приходит в голову, - это использовать цикл for.
Пример 1: Итерация строки с использованием цикла for
h_letters = () for letter in 'human': h_letters.append(letter) print(h_letters)
Когда мы запустим программу, вывод будет:
('человек')
Однако у Python есть более простой способ решить эту проблему, используя List Computing. Понимание списков - это элегантный способ определения и создания списков на основе существующих списков.
Давайте посмотрим, как описанная выше программа может быть написана с использованием списков.
Пример 2: Итерация по строке с использованием понимания списка
h_letters = ( letter for letter in 'human' ) print( h_letters)
Когда мы запустим программу, вывод будет:
('человек')
В приведенном выше примере новый список назначается переменной h_letters, а список содержит элементы повторяющейся строки «human». Мы вызываем print()
функцию, чтобы получить результат.
Синтаксис понимания списка
(выражение для элемента в списке)
Теперь мы можем определить, где используются списки.
Если вы заметили, human
это строка, а не список. В этом сила понимания списка. Он может определить, когда он получает строку или кортеж, и работать с ними как со списком.
Вы можете сделать это с помощью петель. Однако не каждый цикл можно переписать как понимание списка. Но по мере того, как вы усвоите и освоитесь с пониманием списков, вы обнаружите, что заменяете все больше и больше циклов этим элегантным синтаксисом.
Составление списков и лямбда-функции
Составление списков - не единственный способ работы со списками. Различные встроенные функции и лямбда-функции могут создавать и изменять списки с меньшим количеством строк кода.
Пример 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: 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 нельзя переписать в форме понимания списка.