В каждом языке программирования есть свои плюсы и особенности, и Python не исключение. В нем есть такая замечательная вещь, как list comprehension. В этом руководстве мы покажем примеры использования данного подхода.
List comprehension — это упрощенный подход к созданию списка, который использует цикл for, а также операторы if-else для определения того, что окажется в конечном списке.
Преимущества list comprehension
- Простота. List comprehension позволяет избавиться от циклов for и сделать код более понятным. Например, в JavaScript есть что-то похожее в виде
map()
иfilter()
, но они сложнее для понимания новичками. - Скорость. List comprehension происходит быстрее, чем циклы for, которые он заменяет. Это один из первых шагов рефакторинга кода Python.
- Принципы функционального программирования. Для новичков это не так важно, но функциональное программирование — это подход, при котором изменяемые данные не меняются. Поскольку list comprehensions создают новый список без изменения существующего, их можно классифицировать как функциональное программирование.
Создание list comprehension
List comprehension записывается в квадратных скобках и использует цикл for. В процессе создается новый список, в который добавляются все элементы исходного. Когда вы добавляете элементы, вы можете изменить их.
Создадим простой пример списка из числе от 1 до 5 с помощью функции range()
numbers = [num for num in range(1, 6)]
print(numbers, type(numbers))
Посмотрим результат:
[1, 2, 3, 4, 5] <class 'list'>
В этом примере каждое значение в диапазоне присваивается переменной n. Каждое значение возвращается без изменений и добавляется в новый список. Это то же самое, что n перед циклом for.
Итерируемый объект не обязательно должен быть функцией range()
. Это может быть любое итерируемое значение.
List comprehension с if
Создадим пример используя if без List comprehension:
nums = [num for num in range(1, 11)]
even_numbers = []
for num in nums:
if num % 2 == 0:
even_numbers.append(num)
print(even_numbers)
Результат:
[2, 4, 6, 8, 10]
А теперь попробуем сократить конструкцию с помощью list comprehension:
nums = [num for num in range(1, 11)]
even_numbers = [num for num in nums if num % 2 == 0]
print(even_numbers)
Результат:
[2, 4, 6, 8, 10]
List comprehension позволяет заменять длинные конструкции с помощью лаконичной и простой конструкции.
List comprehension с вложенным циклом for
Вот пример List comprehension с вложенным for. Читается нетрудно.
matrix = [
[x for x in range(1, 9)]
for y in range(1, 4)
]
print(matrix)
Результат:
[[1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7, 8]]
Пример со словарем:
Без list comprehension:
people = [{
'first_name': 'Владислав',
'last_name': 'Александрович',
'birthday': '23.12.1998'
}, {
'first_name': 'Екатерина',
'last_name': 'Андреевна',
'birthday': '01.12.1997'
}]
birthdays = []
for person in people:
for term in person:
if term == 'birthday':
birthdays.append(person[term])
print(birthdays)
С list comprehension
people = [{
'first_name': 'Владислав',
'last_name': 'Александрович',
'birthday': '23.12.1998'
}, {
'first_name': 'Екатерина',
'last_name': 'Андреевна',
'birthday': '01.12.1997'
}]
birthdays = [person[term] for person in people for term in person if term == 'birthday']
print(birthdays)
Результат:
['23.12.1998', '01.12.1997']