← Назад к вопросам

С какими объектами работает List Comprehension

2.0 Middle🔥 161 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

List Comprehension в Python

List Comprehension - это компактный способ создания списков. Работает с любыми итерируемыми объектами.

Основной синтаксис

new_list = [expression for item in iterable if condition]

Пример 1: Простое преобразование

# Получить квадраты чисел
numbers = [1, 2, 3, 4, 5]
squares = [x**2 for x in numbers]
# Результат: [1, 4, 9, 16, 25]

# Преобразование строк в числа
strings = ['1', '2', '3']
ints = [int(s) for s in strings]
# Результат: [1, 2, 3]

Пример 2: С условием (filter)

numbers = [1, 2, 3, 4, 5, 6]
even = [x for x in numbers if x % 2 == 0]
# Результат: [2, 4, 6]

# Только положительные числа
values = [1, -2, 3, -4, 5]
positive = [x for x in values if x > 0]
# Результат: [1, 3, 5]

С какими объектами работает

Списки:

numbers = [1, 2, 3]
doubled = [x * 2 for x in numbers]
# [2, 4, 6]

Кортежи:

coords = [(1, 2), (3, 4), (5, 6)]
x_coords = [x for x, y in coords]
# [1, 3, 5]

Строки:

text = "hello"
upper = [c.upper() for c in text]
# ['H', 'E', 'L', 'L', 'O']

Словари:

user = {"name": "John", "age": 30, "city": "NYC"}

# Ключи
keys = [k for k in user]
# ['name', 'age', 'city']

# Значения
values = [v for v in user.values()]
# ['John', 30, 'NYC']

# Пары (key, value)
items = [(k, v) for k, v in user.items()]

Множества (Sets):

numbers = {1, 2, 3, 4, 5}
squared = [x**2 for x in numbers]
# [1, 4, 9, 16, 25]

Диапазоны (range):

numbers = [x for x in range(10)]
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# Чётные от 0 до 20
evens = [x for x in range(0, 20, 2)]
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Файлы:

with open('data.txt', 'r') as f:
    lines = [line.strip() for line in f]
    # Список строк без пробелов в конце

Генераторы:

gen = (x for x in range(5))
result = [x * 2 for x in gen]
# [0, 2, 4, 6, 8]

ZIP:

names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]

result = [(n, a) for n, a in zip(names, ages)]
# [('Alice', 25), ('Bob', 30), ('Charlie', 35)]

Вложенные List Comprehension

# Матрица (список списков)
matrix = [[1, 2], [3, 4], [5, 6]]

# Развернуть матрицу в одномерный список
flat = [x for row in matrix for x in row]
# [1, 2, 3, 4, 5, 6]

# Создать матрицу размером 3x3
matrix = [[x+y for x in range(3)] for y in range(3)]
# [[0, 1, 2], [1, 2, 3], [2, 3, 4]]

Условная логика

numbers = [1, 2, 3, 4, 5]

# IF-ELSE
result = [x if x % 2 == 0 else x*10 for x in numbers]
# [10, 2, 30, 4, 50]

# IF без ELSE (фильтр)
result = [x for x in numbers if x > 2]
# [3, 4, 5]

Сложные преобразования

# Преобразование списка словарей
users = [
    {"name": "Alice", "age": 25},
    {"name": "Bob", "age": 30},
    {"name": "Charlie", "age": 35}
]

names = [u["name"] for u in users]
# ['Alice', 'Bob', 'Charlie']

# Фильтр по условию
adults = [u["name"] for u in users if u["age"] >= 30]
# ['Bob', 'Charlie']

List vs Set vs Dict Comprehension

# List Comprehension
squares_list = [x**2 for x in range(5)]
# [0, 1, 4, 9, 16]

# Set Comprehension
squares_set = {x**2 for x in range(5)}
# {0, 1, 4, 9, 16}

# Dict Comprehension
squares_dict = {x: x**2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# Generator (скобки вместо квадратных)
squares_gen = (x**2 for x in range(5))
# генератор, не список

Практические примеры

# Извлечение данных из JSON
data = [
    {"id": 1, "name": "Alice", "email": "alice@example.com"},
    {"id": 2, "name": "Bob", "email": "bob@example.com"}
]

emails = [person["email"] for person in data]
# ['alice@example.com', 'bob@example.com']

# Разделение строки на отдельные элементы
csv_line = "name,age,city"
fields = [f.strip() for f in csv_line.split(',')]
# ['name', 'age', 'city']

# Удаление пустых строк
lines = ['hello', '', 'world', '  ', 'python']
non_empty = [l.strip() for l in lines if l.strip()]
# ['hello', 'world', 'python']

# Создание словаря из списка
items = ['apple', 'banana', 'cherry']
counts = {item: len(item) for item in items}
# {'apple': 5, 'banana': 6, 'cherry': 6}

Когда использовать List Comprehension

Используй когда:

  1. Нужно преобразовать один список в другой
  2. Нужно отфильтровать элементы
  3. Нужно получить подсписок из вложенной структуры

Не используй когда:

  1. Логика слишком сложная (лучше обычный for)
  2. List Comprehension становится нечитаемой (> 80 символов)
  3. Нужно обработать побочные эффекты

Производительность

import timeit

# List Comprehension (быстро)
result = timeit.timeit(lambda: [x**2 for x in range(1000)], number=1000)

# map + lambda (медленнее)
result2 = timeit.timeit(lambda: list(map(lambda x: x**2, range(1000))), number=1000)

# for цикл (самый медленный для этого)
result3 = timeit.timeit(lambda: [x**2 for x in range(1000)], number=1000)

# List Comprehension обычно самый быстрый вариант

Выводы

  1. List Comprehension работает с любыми итерируемыми объектами
  2. Это компактный и Pythonic способ создания списков
  3. Может содержать условия и сложную логику
  4. Часто быстрее чем map и обычные for циклы
  5. Есть аналоги: Set Comprehension, Dict Comprehension
С какими объектами работает List Comprehension | PrepBro