0Pricing
DSA Interview Prep · Урок

Списки, кортежи и срезы

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

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

Списки Python: динамические массивы

Список Python — это динамический массив, который может хранить что угодно и самостоятельно увеличивается. Он упорядочен, изменяем и обеспечивает мгновенный доступ по индексу за O(1). В коде показаны основные возможности.

nums = [3, 1, 4, 1, 5]
print(nums[0])   # 3
print(nums[-1])  # 5  (last element)
nums.append(9)
print(len(nums)) # 6

Распространённые операции со списками

Запомните это наизусть: добавление с помощью append и удаление с помощью pop с конца выполняются за O(1), а insert в начало — за O(n). Избегайте remove в тесных циклах — при каждом вызове список просматривается заново.

stack = []
stack.append(1)
stack.append(2)
stack.append(3)
print(stack.pop())   # 3  O(1)
print(stack)         # [1, 2]

# insert at index 0 is O(n)
stack.insert(0, 0)
print(stack)         # [0, 1, 2]

Синтаксис срезов

Срез записывается как lst[start:stop:step] и заканчивается непосредственно перед конечной позицией. Классический приём: шаг -1 разворачивает список, не изменяя его. В коде разобрана каждая форма записи.

a = [0, 1, 2, 3, 4, 5]
print(a[1:4])    # [1, 2, 3]
print(a[:3])     # [0, 1, 2]
print(a[3:])     # [3, 4, 5]
print(a[::2])    # [0, 2, 4]  every other
print(a[::-1])   # [5, 4, 3, 2, 1, 0]  reversed

Срезы создают поверхностные копии

Полезная тонкость: срез всегда создаёт новый список, поэтому изменение среза не затрагивает исходный список. Но копирование поверхностное, поэтому вложенные списки всё ещё остаются общими. Будьте внимательны.

original = [1, 2, 3]
copy = original[:]  # shallow copy
copy[0] = 99
print(original)  # [1, 2, 3]  unchanged

# Nested list pitfall
nested = [[1, 2], [3, 4]]
shallow = nested[:]
shallow[0][0] = 99
print(nested)    # [[99, 2], [3, 4]]  changed!

Кортежи: неизменяемые последовательности

Кортеж записывается в круглых скобках и не может быть изменён после создания. Поскольку он хешируем, он может быть ключом словаря или элементом множества — это идеально подходит для пар (row, col) в задачах на сетках.

point = (3, 7)
print(point[0])   # 3

# Use as dict key
grid = {}
grid[(0, 0)] = 'start'
grid[(2, 3)] = 'end'
print(grid[(0, 0)])  # start

# Unpacking
x, y = point
print(x, y)  # 3 7

Когда использовать кортеж, а когда список

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

import sys
a_list  = [1, 2, 3, 4, 5]
a_tuple = (1, 2, 3, 4, 5)
print(sys.getsizeof(a_list))   # e.g. 104 bytes
print(sys.getsizeof(a_tuple))  # e.g. 80 bytes

# Tuple returned from function
def min_max(nums):
    return min(nums), max(nums)

lo, hi = min_max([3, 1, 4, 1, 5])
print(lo, hi)  # 1 5

Ошибки на единицу в срезах

Ошибки на единицу — главная ловушка в задачах с массивами. Помните: lst[i:j] возвращает ровно j-i элементов. Чтобы разделить список посередине, используйте lst[:mid] для левой части и lst[mid:] для правой.

lst = [1, 2, 3, 4, 5, 6]
mid = len(lst) // 2    # 3
left  = lst[:mid]      # [1, 2, 3]
right = lst[mid:]      # [4, 5, 6]
print(left, right)

# How many elements?
print(len(lst[2:5]))   # 3  (indices 2,3,4)

Отрицательные индексы на собеседованиях

В Python есть отрицательные индексы: lst[-1] — последний элемент, а lst[-2] — предпоследний. Предпочитайте lst[-1] вместо lst[len(lst)-1] — интервьюеры заметят более аккуратный вариант.

s = 'abcde'
print(s[-1])    # 'e'
print(s[-3:])   # 'cde'
print(s[:-2])   # 'abc'  (all except last 2)

nums = [10, 20, 30, 40]
print(nums[-2])   # 30
nums[-1] = 99
print(nums)       # [10, 20, 30, 99]

Сортировка и сравнение списков

Для сортировки Python использует Timsort (O(n log n), стабильная сортировка). lst.sort() изменяет список на месте, а sorted(lst) возвращает новый. Для нестандартного порядка используйте параметр ключа. См. код.

words = ['banana', 'fig', 'apple', 'kiwi']
words.sort(key=len)
print(words)  # ['fig', 'kiwi', 'apple', 'banana']

nums = [3, 1, 4, 1, 5]
print(sorted(nums, reverse=True))  # [5, 4, 3, 1, 1]
print(nums)  # unchanged: [3, 1, 4, 1, 5]

Изменение списков во время итерации

Классическая ловушка: никогда не добавляйте и не удаляйте элементы во время перебора списка — Вы пропустите элементы или получите сбой. Вместо этого создайте новый список с помощью включения.

# WRONG — skips elements
nums = [1, 2, 3, 4, 5]
for n in nums:
    if n % 2 == 0:
        nums.remove(n)  # skips 4!
print(nums)  # [1, 3, 5]... but 4 got skipped? Actually removes 2,4

# CORRECT — build new list
nums = [1, 2, 3, 4, 5]
nums = [n for n in nums if n % 2 != 0]
print(nums)  # [1, 3, 5]

Распаковка кортежей в циклах

Распаковка кортежей делает циклы аккуратнее: enumerate возвращает (index, value), а zip одновременно перебирает два списка. Синтаксис *rest помещает оставшуюся часть в отдельную переменную. См. код.

nums = [10, 20, 30]
for i, v in enumerate(nums):
    print(i, v)
# 0 10 / 1 20 / 2 30

a = [1, 2, 3]
b = ['x', 'y', 'z']
for x, y in zip(a, b):
    print(x, y)

first, *rest = [1, 2, 3, 4]
print(first, rest)  # 1 [2, 3, 4]

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

Быстрая проверка — покажите, что Вы усвоили о списках, кортежах и срезах Python. У Вас всё получится. 💪

Итоги урока

Итоги: списки — это динамические массивы с добавлением за O(1), срезы всегда возвращают новую копию, а кортежи неизменяемы и хешируемы. Далее — словари и множества.

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

Урок «Списки, кортежи и срезы» бесплатный?

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

Чему я научусь в уроке «Списки, кортежи и срезы»?

Освойте операции со списками Python, синтаксис срезов и неизменяемость кортежей на практических примерах из классических задач по программированию Ты практикуешь DSA Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

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

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

Сколько времени занимает урок «Списки, кортежи и срезы»?

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

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

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

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

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