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) # Вывод: ['четное', 'нечетное', 'нечетное', 'четное', 'четное', 'нечетное', 'четное', 'четное', 'нечетное']