Функциональность list comprehension предоставляет более краткий и лаконичный синтаксис для создания списков на основе других наборов данных. Она имеет следующий синтаксис:
newlist = [expression for item in iterable (if condition)]
Синтаксис list comprehension
состоит из следующих компонентов:
iterable
: перебираемый источник данных, в качестве которого может выступать список, множество, последовательность, либо даже функция, которая возвращает набор данных, например, range()
item
: извлекаемый из источника данных элемент
expression
: выражение, которое возвращает некоторое значение. Это значение затем попадает в генерируемый список
condition
: условие, которому должны соответствовать извлекаемые из источника данных элементы. Если элемент НЕ удовлетворяет условию, то он НЕ выбирается. Необязательный параметр.
Рассмотрим небольшой пример. Допустим, нам надо выбрать из списка все числа, которые больше 0. В обшем случае мы бы могли написать так:
numbers = [-3, -2, -1, 0, 1, 2, 3] positive_numbers = [] for n in numbers: if n > 0: positive_numbers.append(n) print(positive_numbers) # [1, 2, 3]
Теперь изменим этот код, применив list comprehension
:
numbers = [-3, -2, -1, 0, 1, 2, 3] positive_numbers = [n for n in numbers if n > 0] print(positive_numbers) # [1, 2, 3]
Выражение [n for n in numbers if n > 0]
говорит выбрать из списка numbers каждый элемент в переменную n, если n больше 0 и возврать n в результирующий список.
В качестве источника данных iterable
может использоваться любой перебираемый объект, например, другой список, словарь и т.д. Например, функция range()
возвращает все числя нуля до указанного порога не включая:
numbers = [n for n in range(10)] print(numbers) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Нередко данная конструкция применяется, чтобы создать из словаря список. Например, выберем из словаря все ключи:
dictionary = {"red": "красный", "blue": "синий", "green": "зеленый"} words = [word for word in dictionary] print(words) # ['red', 'blue', 'green']
Параметр expression
представляет выражение, которое возвращает некоторое значение. Это значение затем помещается в генерируемый список. В примерах
выше это был текущий элемент, который извлекается из источника данных:
numbers = [-3, -2, -1, 0, 1, 2, 3] new_numbers = [n for n in numbers] print(new_numbers) # [-3, -2, -1, 0, 1, 2, 3]
Так, в данном случае параметр expression
представляет непосредственно извлекаемый из списка numbers элемент n. Но это могут быть и более сложные значения.
Например, возвратим удвоенное значение числа:
numbers = [-3, -2, -1, 0, 1, 2, 3] new_numbers = [n * 2 for n in numbers] print(new_numbers) # [-6, -4, -2, 0, 2, 4, 6]
Здесь expression
представляет выражение n * 2
Это могут быть и более сложные выражения:
numbers = [-3, -2, -1, 0, 1, 2, 3] new_numbers = [n * 2 if n > 0 else n for n in numbers] print(new_numbers) # [-3, -2, -1, 0, 2, 4, 6]
Здесь параметр expression
представляет выражение n * 2 if n > 0 else n
. В данном случае мы говорим возвратить значение n * 2, если n > 0, иначе возвратить n.
В expression
можно производить различные трансформации с данными. Например, возвратим также из словаря значение по ключу:
dictionary = {"red": "красный", "blue": "синий", "green": "зеленый"} words = [f"{key}: {dictionary[key]}" for key in dictionary] print(words) # ['red: красный', 'blue: синий', 'green: зеленый']
Условие - параметр condition
определяет фильтр для выбора элементов из источника данных. Применим условие для конкретизации выборки, например, выберем только четные числа:
numbers = [n for n in range(10) if n % 2 == 0] print(numbers) # [0, 2, 4, 6, 8]
Выберем только те ключи из словаря, длина которых больше 3:
dictionary = {"red": "красный", "blue": "синий", "green": "зеленый"} words = [f"{key}: {dictionary[key]}" for key in dictionary if len(key) > 3] print(words) # ['blue: синий', 'green: зеленый']