0Pricing
Coding Interview Prep · Урок

Генераторы коллекций и встроенные функции

Пишите лаконичные решения с помощью генераторов списков, словарей и множеств, а также map, filter, zip, enumerate и sorted с функциями key

«Генераторы коллекций и встроенные функции» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.

Включения списков: краткая фильтрация

Включение списка превращает цикл for с append в одну аккуратную строку: [expr for item in iterable if condition]. Оно немного быстрее и показывает хорошее знание Python.

# Traditional loop
squares = []
for n in range(1, 6):
    squares.append(n * n)
print(squares)  # [1, 4, 9, 16, 25]

# List comprehension
squares = [n * n for n in range(1, 6)]
print(squares)  # [1, 4, 9, 16, 25]

# With filter
evens = [n for n in range(10) if n % 2 == 0]
print(evens)    # [0, 2, 4, 6, 8]

Вложенные включения для двумерных сеток

Вложенные включения создают двумерные сетки — это стандартный способ подготовить таблицу DP. Избегайте [[0]*C]*R, поскольку в таком случае все строки используют один и тот же внутренний список. В коде показано исправление.

# WRONG: all rows are the same object!
bad = [[0] * 3] * 3
bad[0][0] = 9
print(bad)  # [[9,0,0],[9,0,0],[9,0,0]]  oops!

# CORRECT: each row is a separate list
good = [[0] * 3 for _ in range(3)]
good[0][0] = 9
print(good)  # [[9,0,0],[0,0,0],[0,0,0]]

Включения словаря и множества

Включения словаря и множества используют фигурные скобки: {k: v for ...} для словаря и {expr for ...} для множества. Оба вида поддерживают фильтрацию, поэтому преобразовать данные или удалить дубликаты можно в одну строку.

# Dict comprehension: square lookup
sq_map = {n: n**2 for n in range(1, 6)}
print(sq_map)  # {1:1, 2:4, 3:9, 4:16, 5:25}

# Set comprehension: unique lengths
words = ['cat', 'dog', 'elephant', 'ant']
unique_lengths = {len(w) for w in words}
print(unique_lengths)  # {3, 8}  (order varies)

Генераторные выражения: экономия памяти

Заключите включение в (), и Вы получите генератор, который выдаёт значения по одному, экономя память. Передавайте его напрямую в sum, max или любую другую функцию для работы с огромными последовательностями.

# List comprehension builds all values at once
total = sum([n**2 for n in range(1_000_000)])

# Generator yields one at a time — lower memory
total = sum(n**2 for n in range(1_000_000))
print(total)  # 333332833333500000

# any/all with generators short-circuit early
nums = [4, 6, 8, 3, 10]
has_odd = any(n % 2 == 1 for n in nums)
print(has_odd)  # True  (stops at 3)

map() и filter(): функциональный стиль

map применяет функцию к каждому элементу, а filter оставляет элементы, прошедшие проверку. Оба объекта вычисляются лениво, поэтому для просмотра результатов оберните их в list(). Включения часто понятнее.

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

# map: apply function to each element
doubled = list(map(lambda n: n * 2, nums))
print(doubled)  # [2, 4, 6, 8, 10]

# filter: keep elements passing predicate
evens = list(filter(lambda n: n % 2 == 0, nums))
print(evens)    # [2, 4]

# Equivalent comprehensions (often preferred)
doubled = [n * 2 for n in nums]
evens   = [n for n in nums if n % 2 == 0]

zip(): объединение последовательностей в пары

zip объединяет две последовательности в пары и останавливается на более короткой — это удобный способ одновременно перебирать два списка. Приём zip(*matrix) транспонирует двумерный список. См. код.

keys   = ['a', 'b', 'c']
values = [1, 2, 3]

pairs = list(zip(keys, values))
print(pairs)  # [('a',1), ('b',2), ('c',3)]

# Build dict from two lists
d = dict(zip(keys, values))
print(d)      # {'a':1, 'b':2, 'c':3}

# Transpose a matrix
matrix = [[1,2,3],[4,5,6],[7,8,9]]
transposed = [list(row) for row in zip(*matrix)]
print(transposed)  # [[1,4,7],[2,5,8],[3,6,9]]

enumerate(): индекс и значение

enumerate возвращает (index, value) во время перебора — это аккуратнее, чем range(len(lst)), и помогает избежать ошибок на единицу. Используйте параметр start, чтобы начать отсчёт с 1.

fruits = ['apple', 'banana', 'cherry']

# Instead of: for i in range(len(fruits)):
for i, fruit in enumerate(fruits):
    print(i, fruit)
# 0 apple / 1 banana / 2 cherry

# Start from 1
for i, fruit in enumerate(fruits, 1):
    print(f'{i}. {fruit}')
# 1. apple / 2. banana / 3. cherry

sorted() с функциями ключа

sorted возвращает новый отсортированный список и принимает функцию ключа для задания порядка. Можно сортировать по длине, по полю кортежа или без учёта регистра. В коде показана сортировка по нескольким ключам.

# Sort by second element of tuple
intervals = [(1,3),(2,1),(0,5)]
print(sorted(intervals, key=lambda x: x[1]))
# [(2,1),(1,3),(0,5)]

# Sort strings case-insensitively
words = ['Banana', 'apple', 'Cherry']
print(sorted(words, key=str.lower))
# ['apple', 'Banana', 'Cherry']

# Sort by multiple keys: first by length, then alphabetically
words = ['fig', 'apple', 'ant', 'kiwi']
print(sorted(words, key=lambda w: (len(w), w)))
# ['ant', 'fig', 'kiwi', 'apple']

min() и max() с параметром key

min и max также принимают ключ, поэтому одним вызовом можно получить элемент с наименьшим или наибольшим вычисленным значением — например, самое длинное слово. См. код.

words = ['banana', 'fig', 'strawberry', 'kiwi']

longest = max(words, key=len)
print(longest)   # strawberry

shortest = min(words, key=len)
print(shortest)  # fig

# Find interval with earliest end
intervals = [(2,6),(1,3),(4,5)]
earlist_end = min(intervals, key=lambda x: x[1])
print(earlist_end)  # (1, 3)

any() и all() для проверок с ранним завершением

any останавливается на первом истинном элементе, а all — на первом ложном. Оба выполняют проверку с ранним завершением, поэтому вместе с генератором быстро и лениво проверяют условия.

nums = [2, 4, 6, 7, 8]

all_even = all(n % 2 == 0 for n in nums)
print(all_even)  # False  (7 is odd)

has_large = any(n > 5 for n in nums)
print(has_large) # True  (6 qualifies, stops there)

# Practical: check if sudoku row has no duplicates
row = [1, 2, 3, 4, 5, 6, 7, 8, 9]
valid = all(1 <= n <= 9 for n in row) and len(set(row)) == 9
print(valid)  # True

sum(), abs() и divmod()

Три математические вспомогательные функции встречаются повсюду: sum, abs и divmod. divmod(a, b) сразу возвращает и частное, и остаток — это идеально подходит для извлечения цифр.

# sum with generator
print(sum(n**2 for n in range(1, 6)))  # 55

# abs for distance problems
print(abs(-7))   # 7

# divmod for digit extraction
num = 1234
digits = []
while num:
    num, d = divmod(num, 10)
    digits.append(d)
digits.reverse()
print(digits)  # [1, 2, 3, 4]

Быстрая проверка

Быстрая проверка — посмотрим, насколько хорошо Вы усвоили включения и встроенные функции. Всего один вопрос — у Вас всё получится. ✅

Итоги урока

Итоги: включения превращают циклы в однострочные конструкции, встроенные функции вроде zip и sorted принимают функции ключа, а генераторы экономят память при однопроходной обработке.

Часто задаваемые вопросы

Урок «Генераторы коллекций и встроенные функции» бесплатный?

Да — полный текст урока «Генераторы коллекций и встроенные функции» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «Генераторы коллекций и встроенные функции»?

Пишите лаконичные решения с помощью генераторов списков, словарей и множеств, а также map, filter, zip, enumerate и sorted с функциями key Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Coding Interview Prep?

Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Генераторы коллекций и встроенные функции»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Coding Interview Prep?

Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Списки, кортежи и срезы
  2. Словари и множества в Python
  3. Генераторы коллекций и встроенные функции
  4. Функции, замыкания и лямбда-выражения
← Назад к Coding Interview Prep