Генераторы списков (List comprehensions) в Python с примерами
В этом уроке вы узнаете о генераторах списков (List comprehensions) в Python, которые позволяют создавать новый список из существующего.
Знакомство с генераторами списков в Python
В программировании часто требуется преобразовать элементы списка и вернуть новый список.
Например, предположим, что у вас есть список из пяти чисел, подобный этому:
numbers = [1, 2, 3, 4, 5]
И вы хотите получить список квадратов на основе этого списка чисел.
Самый простой способ — использовать цикл for:
numbers = [1, 2, 3, 4, 5] squares = [] for number in numbers: squares.append(number**2) print(squares)
В этом примере цикл for перебирает элементы списка чисел, возводит каждое число в квадрат и добавляет результат в список квадратов. Обратите внимание, что квадрат числа — это произведение числа, умноженного само на себя. Например, квадрат числа 2 равен 2*2 = 4, квадрат числа 3 равен 3*3 = 9 и так далее.
Чтобы сделать код более кратким, вы можете использовать встроенную функцию map() с лямбда-выражением:
numbers = [1, 2, 3, 4, 5] squares = list(map(lambda number: number**2, numbers)) print(squares)
Поскольку функция map() возвращает итератор, вам необходимо использовать функцию list() для преобразования итератора в список.
И цикл for, и функция map() могут помочь вам создать новый список на основе существующего. Но код будет не очень лаконичен и красив.
Чтобы помочь вам создать список на основе преобразования элементов существующего списка, Python предоставляет свойство, называемое генератором списка (List comprehensions).
Ниже показано, как использовать генератор списка для создания списка квадратов из списка чисел:
numbers = [1, 2, 3, 4, 5] squares = [number**2 for number in numbers] print(squares)
А вот часть понимания списка:
squares = [number**2 for number in numbers]
Генератор списка состоит из следующих частей:
- Список ввода(числа).
- Переменная, представляющая элементы списка(число).
- Выходное выражение(число**2), которое возвращает элементы выходного списка из элементов входного списка.
Ниже показан основной синтаксис генератора списка Python:
[output_expression for element in list]
Это эквивалентно следующему:
output_list = [] for element in list: output_list.append(output_expression)
List comprehensions с условием if в Python
Ниже приведен список пяти самых высоких гор на Земле:
mountains = [ ['Makalu', 8485], ['Lhotse', 8516], ['Kanchendzonga', 8586], ['K2', 8611], ['Everest', 8848] ]
Чтобы получить список гор, высота которых превышает 8600 метров, вы можете использовать цикл for или функцию filter() с таким лямбда-выражением:
mountains = [ ['Makalu', 8485], ['Lhotse', 8516], ['Kanchendzonga', 8586], ['K2', 8611], ['Everest', 8848] ] highest_mountains = list(filter(lambda m: m[1] > 8600, mountains)) print(highest_mountains)
Выход:
[['K2', 8611], ['Everest', 8848]]
Как и функция map(), функция filter() возвращает итератор. Поэтому вам нужно использовать функцию list() для преобразования итератора в список.
List comprehensions в Python предоставляют необязательный предикат, который позволяет указать условие для включения элементов списка в новый список:
[output_expression for element in list if condition]
Это позволяет вам заменить filter() лямбда-выражением:
mountains = [ ['Makalu', 8485], ['Lhotse', 8516], ['Kanchendzonga', 8586], ['K2', 8611], ['Everest', 8848] ] highest_mountains = [m for m in mountains if m[1] > 8600] print(highest_mountains)
Выход:
[['K2', 8611], ['Everest', 8848]]