List comprehension

Последнее обновление: 24.12.2022

Функциональность 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

В качестве источника данных 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: зеленый']
Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850