📖 Теория

⚡ Кратко

Практикум закрепляет списки, кортежи, вложенные списки и работу со строками.

В простых задачах достаточно index(), split(), max() и сортировки.

Для изменения списка на месте безопаснее обходить индексы с конца или присваивать срезу.

Для парных комбинаций используйте вложенные циклы или comprehension.

В задачах с вложенными кортежами список внутри кортежа остаётся изменяемым.

Для проверки последовательности удобно продвигать указатель по исходному списку.

Задача с шифром Цезаря в источнике фактически кодирует символы числами ASCII со сдвигом.

products = ["Bread", "Butter", "Cheese", "Milk", "Eggs"]
if "Milk" in products:
    print(products.index("Milk") + 1)
else:
    print("Товар Milk отсутствует")

Топ-3 ошибки: путать ссылку и копию; ожидать порядок там, где его нет; усложнять выражение, когда обычный цикл читается лучше.

Как подходить к практикуму

Сначала определите тип операции: поиск одного элемента, построение нового списка, изменение исходного списка, группировка или обход вложенной структуры.

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

products = ["Bread", "Butter", "Cheese", "Milk", "Eggs"]
if "Milk" in products:
    print(products.index("Milk") + 1)
else:
    print("Товар Milk отсутствует")

Списки уникальных значений

Источник просит получить уникальные слова в алфавитном порядке без учёта регистра. Для этого слова приводятся к lower(), очищаются от точки, затем передаются в set().

Если порядок появления важен, одного set() недостаточно, потому что множество не сохраняет учебно ожидаемый порядок.

text = "Python is a great programming language. Python is popular and powerful."
words = [word.strip(".").lower() for word in text.split()]
unique_words = sorted(set(words))
print("Количество уникальных слов:", len(unique_words))
print("Уникальные слова:", unique_words)

Изменяемое внутри неизменяемого

Кортеж нельзя заменить по индексу, но если внутри кортежа лежит список, сам список можно менять.

Это важно в задачах про сотрудников и проекты: кортеж хранит имя и список задач, а список задач остаётся изменяемым объектом.

employees = [
    ("Alice", ["Review documents", "Call clients"]),
    ("Bob", ["Check emails"]),
]

for name, tasks in employees:
    if name == "Alice":
        tasks.append("Prepare presentation")
        print(tasks)

Подпоследовательность

Проверка последовательности цифр означает: все введённые символы должны встретиться в исходном списке в том же порядке, но не обязательно подряд.

Удобная стратегия — держать индекс следующего ожидаемого символа и продвигать его при совпадении.

my_list = ["3", "6", "3", "2", "9", "3", "9", "4", "3", "9", "0"]
sequence = "943"

position = 0
for digit in my_list:
    if position < len(sequence) and digit == sequence[position]:
        position += 1

print(position == len(sequence))
Проверить по документации: Современные уточнения в этом разделе сверяйте с актуальной документацией Python 3.x, особенно если используете поведение памяти или производительности как часть архитектурного решения.