Добрый, добрый Python
December 22, 2023

Stepik: Генераторы списков (List comprehension)

List comprehension - это способ создания нового списка на основе существующего списка или последовательности данных в Python. Он позволяет нам сократить код и делает его более читаемым.

При использовании list comprehension, мы можем объединить цикл for и условное выражение в одной строке, чтобы создать новый список.

Общий синтаксис list comprehension выглядит так:

new_list = [выражение for элемент in исходный_список (если условие)]

Для лучшего понимания, давайте я начну сразу с конкретного примера. Предположим, мы хотели бы сформировать список из квадратов целых чисел от 0 до N. Используя наши текущие знания, очевидно, это можно было бы сделать, следующим образом:

N = 6
a = [0] * N
for i in range(N):
	a[i] = i ** 2
print(a)
# Вывод: [0, 1, 4, 9, 16, 25]

Так же можно прописать это все в одну строку:

N = 6
a = [x ** 2 for x in range(N)]
print(a)
# Вывод: [0, 1, 4, 9, 16, 25]

Синтаксис генератора списков

[<способ формирования значения> for <переменная> in <итерируемый объект>]

Примеры использования на практике

a = [1 for x in range(5)] # создаем список из пяти единиц
print(a)
# Вывод: [1, 1, 1, 1, 1]
N = 7
a = [1 for x in range(N)] # создаем список из N единиц
print(a)
# Вывод: [1, 1, 1, 1, 1, 1, 1] 

Переменная, прописанная в генераторе (в данном случае х) доступна только в генераторе. За пределами она уже пропадает.

N = 7
a = [x % 4 for x in range(N)] # список состоящий из остатков от деления на 4:
print(a)
# Вывод: [0, 1, 2, 3, 0, 1, 2]
N = 7
a = [x % 2 == 0 for x in range(N)] # проверяем, какие значения четные, а какие нет
print(a)
# Вывод: [True, False, True, False, True, False, True]
N = 7
a = [0.5 * x + 1 for x in range(N)] # формируем значения линейной функции
print(a)
# Вывод: [1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0]
d_inp = input('Введите целые числа через пробел: ')
lst = [int(d) for d in d_inp.split()]
print(lst)
# Ввод: 1 2 3 65 85 12
# Вывод: [1, 2, 3, 65, 85, 12]
a = [d for d in 'python'] # так же можно разбить строку
print(a)
# Вывод: ['p', 'y', 't', 'h', 'o', 'n']
a = [ord(d) for d in 'python'] # так же можно разбить строку
print(a)
# Вывод: [112, 121, 116, 104, 111, 110]

Так же в списках можно прописывать условия

a = [x for x in range(-5, 5) if x < 0] # выводим значения меньше 0
print(a)
# Вывод: [-5, -4, -3, -2, -1]
a = [x for x in range(-5, 5) if x % 2 == 0] # выводим только четные значения
print(a)
# Вывод: [-4, -2, 0, 2, 4]
a = [x for x in range(-6, 7) if x % 2 == 0 and x % 3 == 0] # выводим только четные значения, которые кратные 3
print(a)
# Вывод: [-6, 0, 6]
cities = ["Москва", "Тверь", "Рязань", "Ярославль", "Владимир"]
a = [city for city in cities if len(city) < 7]
print(a)
# Вывод: ['Москва', 'Тверь', 'Рязань']

Можно вставить тернарный условный оператор. Допустим, на основании этого списка хотим составить список, который будет определять четное или нечетное число

d = [4, 3, -5, 0, 2, 11, 122, -8, 9]
a = ['четное' if x % 2 == 0 else 'нечетное' for x in d]
print(a)
# Вывод: ['четное', 'нечетное', 'нечетное', 'четное', 'четное', 'нечетное', 'четное', 'четное', 'нечетное']

ТЕКСТ ЛЕКЦИИ