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

Для чего используются list comprehension?

1.0 Junior🔥 221 комментариев
#Python Core

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

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

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

Для чего используются list comprehension?

List comprehension (списковое выражение) — это компактный и эффективный способ создания новых списков на основе существующих последовательностей. Это один из самых мощных и часто используемых инструментов Python, который делает код более читаемым и производительным.

Основное назначение

List comprehension используется для:

  1. Трансформации элементов списка
  2. Фильтрации элементов по условию
  3. Создания новых списков из существующих данных
  4. Замены циклов for с append более компактным синтаксисом

Синтаксис

# Базовый синтаксис
[expression for item in iterable]

# С условием
[expression for item in iterable if condition]

# С вложенными циклами
[expression for item in iterable1 for item2 in iterable2]

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

1. Трансформация элементов

Преобразование значений в списке:

# Традиционный способ (не Pythonic)
numbers = [1, 2, 3, 4, 5]
squares = []
for n in numbers:
    squares.append(n ** 2)
print(squares)  # [1, 4, 9, 16, 25]

# С list comprehension (Pythonic)
numbers = [1, 2, 3, 4, 5]
squares = [n ** 2 for n in numbers]
print(squares)  # [1, 4, 9, 16, 25]

2. Фильтрация элементов

Отбор элементов по условию:

# Традиционный способ
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = []
for n in numbers:
    if n % 2 == 0:
        even_numbers.append(n)
print(even_numbers)  # [2, 4, 6, 8, 10]

# С list comprehension
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = [n for n in numbers if n % 2 == 0]
print(even_numbers)  # [2, 4, 6, 8, 10]

3. Преобразование и фильтрация одновременно

users = [
    {'name': 'Иван', 'age': 25},
    {'name': 'Мария', 'age': 30},
    {'name': 'Петр', 'age': 22},
    {'name': 'Анна', 'age': 28}
]

# Получить имена пользователей старше 25 лет
adult_names = [u['name'] for u in users if u['age'] > 25]
print(adult_names)  # ['Мария', 'Анна']

4. Работа со строками

# Преобразование строк
words = ['hello', 'world', 'python']
upper_words = [w.upper() for w in words]
print(upper_words)  # ['HELLO', 'WORLD', 'PYTHON']

# Фильтрация длинных слов
long_words = [w for w in words if len(w) > 4]
print(long_words)  # ['hello', 'world', 'python']

# Получить первые буквы
first_letters = [w[0] for w in words]
print(first_letters)  # ['h', 'w', 'p']

5. Вложенные list comprehension

Работта с многомерными данными:

# Создание матрицы 3x3
matrix = [[i + j for j in range(3)] for i in range(3)]
print(matrix)
# [[0, 1, 2], [1, 2, 3], [2, 3, 4]]

# Развёртывание вложенного списка
nested = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [x for row in nested for x in row]
print(flattened)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

# С условием
flattened_even = [x for row in nested for x in row if x % 2 == 0]
print(flattened_even)  # [2, 4, 6, 8]

6. Преобразование типов данных

# Строка в список целых чисел
string_numbers = "12345"
int_list = [int(x) for x in string_numbers]
print(int_list)  # [1, 2, 3, 4, 5]

# Словарь в список кортежей
user_dict = {'name': 'Иван', 'age': 30, 'city': 'Москва'}
pairs = [(k, v) for k, v in user_dict.items()]
print(pairs)  # [('name', 'Иван'), ('age', 30), ('city', 'Москва')]

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

List comprehension быстрее, чем циклы с append:

import timeit

# Традиционный способ
def traditional():
    result = []
    for i in range(10000):
        result.append(i ** 2)
    return result

# List comprehension
def comprehension():
    return [i ** 2 for i in range(10000)]

time1 = timeit.timeit(traditional, number=1000)
time2 = timeit.timeit(comprehension, number=1000)

print(f"Цикл: {time1:.4f}с")
print(f"List comprehension: {time2:.4f}с")
# List comprehension обычно быстрее на 10-30%

Когда не использовать list comprehension

# ❌ Слишком сложное — используй обычный цикл
complex = [process(x, deep_calculation(x), another_func(x)) 
           for x in large_list if complex_condition(x)]

# ✅ Лучше использовать обычный цикл для читаемости
result = []
for x in large_list:
    if complex_condition(x):
        processed = process(x, deep_calculation(x), another_func(x))
        result.append(processed)

# ❌ Слишком вложенное — используй функции
result = [[y for y in range(x) if y % 2 == 0] 
          for x in range(10) if x > 3]

# ✅ Лучше разбить на части
inner = lambda x: [y for y in range(x) if y % 2 == 0]
outer = [inner(x) for x in range(10) if x > 3]

Альтернативы: dict и set comprehension

# Dict comprehension
words = ['apple', 'banana', 'cherry']
word_lengths = {w: len(w) for w in words}
print(word_lengths)  # {'apple': 5, 'banana': 6, 'cherry': 6}

# Set comprehension
unique_lengths = {len(w) for w in words}
print(unique_lengths)  # {5, 6}

# Generator expression (для больших данных)
squares_gen = (x ** 2 for x in range(10000))

Лучшие практики

# ✅ Простой и читаемый list comprehension
good = [x * 2 for x in range(10)]

# ✅ С одним условием — всё ещё читаемо
good = [x for x in range(100) if x % 7 == 0]

# ✅ С трансформацией и условием
good = [x.upper() for x in words if len(x) > 3]

# ❌ Слишком сложное — требует разбиения
bad = [complex_func(x) for x in range(1000) 
       if condition1(x) and condition2(x) and condition3(x)]

Заключение

List comprehension — это идиоматичный способ Python для создания новых списков. Используй его для простых трансформаций и фильтраций, так как он:

  • Читабельнее и компактнее цикла with append
  • Быстрее работает
  • Является Pythonic подходом

Однако помни, что если выражение становится слишком сложным, лучше использовать обычный цикл для сохранения читаемости. Python ценит ясность кода больше, чем его краткость.