Каппес Даниил Олегович

ПРАКТИКУМ PYTHON · ЗАНЯТИЕ 9

Методы списков, сортировка и списочные выражения

Список умеет больше, чем добавлять в конец: вставлять, искать, удалять по значению, сортироваться — и собираться одной строкой.

Чему научимся

Методы списков

МетодЧто делает
insert(i, x)вставляет x на позицию i, сдвигая остальные вправо
index(x)индекс первого элемента, равного x
remove(x)удаляет первый элемент, равный x
pop(i)удаляет элемент по индексу и возвращает его; без аргумента — последний
count(x)сколько раз x встречается в списке
reverse()переворачивает список на месте
clear()удаляет все элементы
copy()создаёт копию списка
names = ['Gvido', 'Roman', 'Timur']
names.insert(0, 'Anders')
names.insert(3, 'Josef')
print(names)

Результат

['Anders', 'Gvido', 'Roman', 'Josef', 'Timur']

insert() не боится неверного индекса: слишком большой поставит элемент в конец, а отрицательный вне диапазона — в начало. А вот index() и remove() строги: если такого значения в списке нет, программа останавливается с ошибкой ValueError.

names = ['Gvido', 'Roman', 'Timur']
if 'Anders' in names:
    print(names.index('Anders'))
else:
    print('Такого значения нет в списке')

remove() удаляет только первое вхождение. Чтобы убрать все, его вызывают в цикле while, пока значение ещё есть в списке.

pop() отличается от del тем, что возвращает удалённое: item = names.pop(1) и удалит элемент, и запомнит его.

Разница между reverse() и срезом [::-1] принципиальная: метод переворачивает сам список, а срез создаёт новый, оставляя исходный нетронутым. То же и с copy(): names.copy(), list(names) и names[:] дают одинаковый результат — новый список.

Общее правило: строковые методы возвращают новую строку, списочные меняют сам список. Поэтому s = s.lower() писать нужно, а numbers = numbers.sort() — нельзя: sort() ничего не возвращает, и в списке окажется пустота.

9.1

Шесть операций подряд

Дополните приведённый код так, чтобы он по очереди выполнил шесть действий, печатая результат каждого:

  1. заменил второй элемент списка на 17;
  2. добавил числа 4, 5 и 6 в конец;
  3. удалил первый элемент;
  4. удвоил список;
  5. вставил число 25 по индексу 3;
  6. вывел получившийся список.

Код

numbers = [8, 9, 10, 11]
Формат выходных данных
Шесть строк.
Вывод
[8, 17, 10, 11]
[8, 17, 10, 11, 4, 5, 6]
[17, 10, 11, 4, 5, 6]
[17, 10, 11, 4, 5, 6, 17, 10, 11, 4, 5, 6]
[17, 10, 11, 25, 4, 5, 6, 17, 10, 11, 4, 5, 6]
[17, 10, 11, 25, 4, 5, 6, 17, 10, 11, 4, 5, 6]
Подсказка 1

«Второй элемент» — это индекс 1: нумерация с нуля.

Подсказка 2

Добавить сразу три числа умеет extend(), а удвоить список — умножение на 2.

Разбор
  1. numbers[1] = 17 — замена по индексу.
  2. numbers.extend([4, 5, 6]) — добавление трёх элементов.
  3. del numbers[0] — удаление первого.
  4. numbers *= 2 — удвоение.
  5. numbers.insert(3, 25) — вставка по индексу.
Решение
numbers = [8, 9, 10, 11]

numbers[1] = 17            # второй элемент — это индекс 1
print(numbers)

numbers.extend([4, 5, 6])  # добавляем сразу три числа
print(numbers)

del numbers[0]
print(numbers)

numbers *= 2               # то же, что numbers = numbers * 2
print(numbers)

numbers.insert(3, 25)      # вставка сдвигает остальные вправо
print(numbers)

print(numbers)

Каждая операция меняет сам список, поэтому следующая работает уже с новым содержимым. Отсюда и разница между «вторым элементом» в начале и в конце: список успел перестроиться дважды.

9.2

Переставить минимум и максимум

На вход подаётся строка текста, содержащая различные натуральные числа. Из неё формируется список чисел. Напишите программу, которая меняет местами наименьший и наибольший элементы этого списка.

Формат входных данных
Одна строка с числами через пробел.
Формат выходных данных
Список чисел через пробел с переставленными минимумом и максимумом.
Ввод 1
3 4 5 2 1
Вывод 1
3 4 1 2 5
Ввод 2
10 20
Вывод 2
20 10
Подсказка 1

Чтобы поменять элементы местами, нужны их индексы, а min() и max() дают значения.

Подсказка 2

Индекс значения находит метод index().

Разбор
  1. Читаем числа и переводим их из строк в числа.
  2. Находим наименьшее и наибольшее значения, а по ним — их индексы.
  3. Меняем элементы местами приёмом a, b = b, a.
  4. Печатаем список через пробел распаковкой.
Решение
numbers = input().split()
for i in range(len(numbers)):
    numbers[i] = int(numbers[i])   # split() дал строки, нужны числа

smallest = numbers.index(min(numbers))   # индекс наименьшего
largest = numbers.index(max(numbers))    # индекс наибольшего

numbers[smallest], numbers[largest] = numbers[largest], numbers[smallest]

print(*numbers)

Перевод в числа здесь обязателен: у строк min() сравнивал бы по алфавиту, и в списке '10 9' наименьшим оказалось бы '10'. Строка '10' меньше строки '9', потому что первый символ 1 идёт раньше 9.

9.3

Количество артиклей

На вход подаётся строка, содержащая английский текст. Напишите программу, которая подсчитывает общее количество артиклей a, an и the.

Артикль может стоять в начале предложения и писаться с заглавной буквы: A, An, The.

Формат входных данных
Одна строка с английским текстом.
Формат выходных данных
Строка вида «Общее количество артиклей: 7».
Ввод 1
William Shakespeare was born in the town of Stratford, England, in the year 1564. When he was a young man, Shakespeare moved to the city of London, where he began writing plays. His plays were soon very successful, and were enjoyed both by the common people of London and also by the rich and famous. In addition to his plays, Shakespeare wrote many short poems and a few longer poems. Like his plays, these poems are still famous today.
Вывод 1
Общее количество артиклей: 7
Ввод 2
The cat and a dog
Вывод 2
Общее количество артиклей: 2
Подсказка 1

Искать подстроку 'a' в тексте нельзя — она есть в половине слов. Считать надо целые слова.

Подсказка 2

Целые слова даёт split(), а разницу в регистре снимает lower().

Разбор
  1. Приводим строку к нижнему регистру и разбиваем на слова.
  2. Перебираем слова и считаем те, что равны a, an или the.
  3. Печатаем результат с подписью.
Решение
words = input().lower().split()   # нижний регистр — чтобы The считалось наравне с the

count = 0
for word in words:
    if word == 'a' or word == 'an' or word == 'the':
        count += 1

print('Общее количество артиклей:', count)

Слова со знаками препинания — вроде plays, — артиклями не бывают, поэтому очищать их не нужно. А вот если бы считали, скажем, слово and, пришлось бы: and. не равно and.

9.4

Взлом Братства Стали

Курьер забрёл в Хидден-Вэли — секретный бункер Братства Стали — и согласился помочь с их бедой. Странный вирус оставляет комментарии в программах на терминалах Братства. Программисты Братства комментариев никогда не пишут, поэтому удаление им не навредит. Помогите писцу Ибсену убрать все комментарии из программы.

На первой строке вводится символ решётки и сразу за ним натуральное число n — количество строк программы. Далее следуют n строк кода. Нужно вывести те же строки, удалив комментарии и пробелы в конце строк. Пустую строку вместо первой строки ввода выводить не надо.

Не забудьте про метод rstrip() — он убирает пустое пространство между кодом и комментарием.

Формат входных данных
Первая строка — решётка и число n, затем n строк кода.
Формат выходных данных
n строк без комментариев.
Ввод
#4
print("Введите пароль")   #ахахахах не поймать меня
#долой Макнамару
password = input()
if password == "hoover":
Вывод
print("Введите пароль")

password = input()
if password == "hoover":
Подсказка 1

Число n спрятано в первой строке после решётки — его достают срезом.

Подсказка 2

Где начинается комментарий, покажет find('#'); всё, что правее, отрезается срезом.

Разбор
  1. Первая строка: отбрасываем решётку срезом [1:] и переводим остаток в число.
  2. n раз читаем строку и ищем в ней решётку.
  3. Если решётка нашлась — оставляем всё, что левее неё.
  4. Убираем концевые пробелы методом rstrip() и печатаем.
Решение
n = int(input()[1:])       # первая строка — решётка и число: срез убирает решётку

for i in range(n):
    line = input()
    sharp = line.find('#')
    if sharp != -1:        # -1 означает «решётки нет»
        line = line[:sharp]
    print(line.rstrip())   # убираем пробелы, оставшиеся перед комментарием

Строка, которая была комментарием целиком, превращается в пустую — её всё равно печатают, потому что в программе она занимала строку. А вот find() здесь безопаснее index(): у строки без комментария index() остановил бы программу ошибкой.

Сортировка методом sort()

Писать пузырьковую сортировку каждый раз не нужно: у списка есть готовый метод sort(). Он сортирует список на месте, по возрастанию.

a = [1, 7, -3, 9, 0, -67, 34]
a.sort()
print(a)

Результат

[-67, -3, 0, 1, 7, 9, 34]

Чтобы отсортировать по убыванию, добавляют именованный параметр:

a.sort(reverse=True)
print(a)

Результат

[34, 9, 7, 1, 0, -3, -67]

Строки sort() тоже сортирует — по алфавиту (точнее, по кодам символов):

a = ['бета', 'альфа', 'дельта', 'гамма']
a.sort()
print(a)

Результат

['альфа', 'бета', 'гамма', 'дельта']

Внутри sort() работает алгоритм TimSort — один из самых быстрых. Пузырьковая сортировка с прошлого занятия нужна была не ради результата, а чтобы понять, как сортировка вообще устроена.

9.5

Сортировка чисел

На вход подаётся строка текста, содержащая целые числа. Из неё формируется список чисел. Напишите программу, которая выводит этот список сначала по возрастанию, а затем по убыванию.

Формат входных данных
Одна строка с числами через пробел.
Формат выходных данных
Две строки: по возрастанию и по убыванию.
Ввод
4 5 1 2 3 8
Вывод
1 2 3 4 5 8
8 5 4 3 2 1
Подсказка 1

После split() в списке строки — сначала переведите их в числа, иначе сортировка пойдёт по алфавиту.

Подсказка 2

Второй раз сортировать заново не обязательно: у sort() есть параметр reverse.

Разбор
  1. Читаем строку, разбиваем и переводим элементы в числа.
  2. Сортируем и печатаем.
  3. Сортируем с reverse=True и печатаем снова.
Решение
numbers = input().split()
for i in range(len(numbers)):
    numbers[i] = int(numbers[i])

numbers.sort()
print(*numbers)

numbers.sort(reverse=True)   # тот же список, порядок обратный
print(*numbers)

Второй sort() работает уже с отсортированным списком — и это ничему не мешает. А вот numbers = numbers.sort() сломало бы всё: метод ничего не возвращает, и в переменной оказалось бы пустое значение.

Списочные выражения

Собирать список циклом с append() — привычно, но многословно:

numbers = []
for i in range(10):
    numbers.append(i)

В Python это записывается одной строкой — списочным выражением (list comprehension):

numbers = [i for i in range(10)]

Общий вид такой: [выражение for переменная in последовательность]. Читается справа налево: «пройди по последовательности, и для каждого значения посчитай выражение».

squares = [i ** 2 for i in range(10)]
cubes = [i ** 3 for i in range(10, 21)]
chars = [c for c in 'abcdefg']

Списочным выражением удобно и считывать данные:

lines = [input() for _ in range(int(input()))]
numbers = [int(input()) for _ in range(int(input()))]

Подчёркивание вместо имени означает «переменная не нужна»: она нигде не используется, важно только количество повторений.

В выражение можно добавить условие — тогда в список попадёт не всё:

evens = [i for i in range(21) if i % 2 == 0]
Списочное выражениеЧто получится
[0 for i in range(5)][0, 0, 0, 0, 0]
[i ** 2 for i in range(1, 6)][1, 4, 9, 16, 25]
[i * 10 for i in numbers]каждый элемент умножен на 10
[c * 2 for c in word]каждая буква удвоена
[m[0] for m in words]первые буквы слов
[i for i in numbers if i < 10]только элементы меньше 10

Циклов в выражении может быть и два — они работают как вложенные: первый внешний, второй внутренний.

numbers = [i * j for i in range(1, 5) for j in range(2)]
print(numbers)

Результат

[0, 1, 0, 2, 0, 3, 0, 4]

То же самое обычными циклами заняло бы четыре строки:

numbers = []
for i in range(1, 5):
    for j in range(2):
        numbers.append(i * j)

Списочное выражение — не соревнование в краткости. Уложив в одну строку три условия и вложенный цикл, вы получите строку, которую сами не прочитаете через неделю. Седьмой пункт «Дзена Python» гласит: читаемость имеет значение.

9.6

Без первой буквы

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

Код

keywords = ['False', 'True', 'None', 'and', 'with', 'as', 'assert', 'break',
            'class', 'continue', 'def', 'del', 'elif', 'else', 'except',
            'finally', 'try', 'for', 'from', 'global', 'if', 'import', 'in',
            'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise',
            'return', 'while', 'yield']
new_keywords = 
print(new_keywords)
Формат выходных данных
Список строк.
Вывод
['alse', 'rue', 'one', 'nd', 'ith', 's', 'ssert', 'reak', 'lass', 'ontinue', 'ef', 'el', 'lif', 'lse', 'xcept', 'inally', 'ry', 'or', 'rom', 'lobal', 'f', 'mport', 'n', 's', 'ambda', 'onlocal', 'ot', 'r', 'ass', 'aise', 'eturn', 'hile', 'ield']
Подсказка 1

Удалить первый символ строки умеет срез.

Подсказка 2

Выражение применяется к каждому слову: [… for word in keywords].

Разбор
  1. Срез word[1:] — это слово без первого символа.
  2. Ставим его выражением списочного выражения.
Решение
keywords = ['False', 'True', 'None', 'and', 'with', 'as', 'assert', 'break',
            'class', 'continue', 'def', 'del', 'elif', 'else', 'except',
            'finally', 'try', 'for', 'from', 'global', 'if', 'import', 'in',
            'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise',
            'return', 'while', 'yield']

new_keywords = [word[1:] for word in keywords]   # срез без первого символа
print(new_keywords)

Исходный список при этом не изменился — списочное выражение всегда создаёт новый. В этом его отличие от списочных методов, которые правят список на месте.

9.7

Длины слов

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

Код

keywords = ['False', 'True', 'None', 'and', 'with', 'as', 'assert', 'break',
            'class', 'continue', 'def', 'del', 'elif', 'else', 'except',
            'finally', 'try', 'for', 'from', 'global', 'if', 'import', 'in',
            'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise',
            'return', 'while', 'yield']
lengths = 
print(lengths)
Формат выходных данных
Список чисел.
Вывод
[5, 4, 4, 3, 4, 2, 6, 5, 5, 8, 3, 3, 4, 4, 6, 7, 3, 3, 4, 6, 2, 6, 2, 2, 6, 8, 3, 2, 4, 5, 6, 5, 5]
Подсказка 1

Длину строки даёт len().

Подсказка 2

Она и будет выражением в квадратных скобках.

Разбор
  1. Перебираем слова списка.
  2. Для каждого берём len(word).
Решение
keywords = ['False', 'True', 'None', 'and', 'with', 'as', 'assert', 'break',
            'class', 'continue', 'def', 'del', 'elif', 'else', 'except',
            'finally', 'try', 'for', 'from', 'global', 'if', 'import', 'in',
            'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise',
            'return', 'while', 'yield']

lengths = [len(word) for word in keywords]
print(lengths)

Обратите внимание: типы поменялись. Из списка строк получился список чисел — списочное выражение не обязано сохранять тип элементов.

9.8

Слова не короче пяти букв

Дополните приведённый код списочным выражением, чтобы получить новый список только из слов длиной не менее пяти символов.

Код

keywords = ['False', 'True', 'None', 'and', 'with', 'as', 'assert', 'break',
            'class', 'continue', 'def', 'del', 'elif', 'else', 'except',
            'finally', 'try', 'for', 'from', 'global', 'if', 'import', 'in',
            'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise',
            'return', 'while', 'yield']
new_keywords = 
print(new_keywords)
Формат выходных данных
Список строк.
Вывод
['False', 'assert', 'break', 'class', 'continue', 'except', 'finally', 'global', 'import', 'lambda', 'nonlocal', 'raise', 'return', 'while', 'yield']
Подсказка 1

Здесь нужен не только результат, но и отбор — то есть условие.

Подсказка 2

Условие пишется в конце выражения: [word for word in keywords if …].

Разбор
  1. Выражение — само слово, без изменений.
  2. Условие — len(word) >= 5.
Решение
keywords = ['False', 'True', 'None', 'and', 'with', 'as', 'assert', 'break',
            'class', 'continue', 'def', 'del', 'elif', 'else', 'except',
            'finally', 'try', 'for', 'from', 'global', 'if', 'import', 'in',
            'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise',
            'return', 'while', 'yield']

new_keywords = [word for word in keywords if len(word) >= 5]
print(new_keywords)

«Не менее пяти» — это >= 5, а не > 5: слово False длиной ровно пять символов и должно попасть в список. Такие границы стоит проверять на примере, а не на глаз.

9.9

Числа-палиндромы

Дополните приведённый код, используя списочное выражение, так чтобы получить список всех чисел-палиндромов от 100 до 1000.

Числовой палиндром читается одинаково слева направо и справа налево: 101, 232, 818, 999.

Код

palindromes = []
print(palindromes)
Формат выходных данных
Список трёхзначных палиндромов.
Вывод
[101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292, 303, 313, 323, 333, 343, 353, 363, 373, 383, 393, 404, 414, 424, 434, 444, 454, 464, 474, 484, 494, 505, 515, 525, 535, 545, 555, 565, 575, 585, 595, 606, 616, 626, 636, 646, 656, 666, 676, 686, 696, 707, 717, 727, 737, 747, 757, 767, 777, 787, 797, 808, 818, 828, 838, 848, 858, 868, 878, 888, 898, 909, 919, 929, 939, 949, 959, 969, 979, 989, 999]
Подсказка 1

Число само себя задом наперёд не читает — а вот строка умеет.

Подсказка 2

Переведите число в строку функцией str() и сравните её с развёрнутой копией [::-1].

Разбор
  1. Перебираем числа от 100 до 1000.
  2. Каждое превращаем в строку.
  3. Условие: строка совпадает со своим разворотом.
Решение
palindromes = [i for i in range(100, 1001) if str(i) == str(i)[::-1]]
print(palindromes)

Здесь два инструмента работают вместе: строковый разворот из шестого занятия и списочное выражение с условием. Число 1000 в диапазон входит, но палиндромом не является, так что на ответ это не влияет.

9.10

Квадраты по строкам

На вход подаётся натуральное число n. Напишите программу, использующую списочное выражение, которая создаёт список квадратов чисел от 1 до n, а затем выводит его элементы построчно.

Для вывода используйте цикл for.

Формат входных данных
Натуральное число n.
Формат выходных данных
n строк с квадратами.
Ввод
5
Вывод
1
4
9
16
25
Подсказка 1

Список собирается одной строкой, а печатается циклом.

Подсказка 2

Квадрат — это i ** 2.

Разбор
  1. [i ** 2 for i in range(1, n + 1)] — готовый список квадратов.
  2. Печатаем его элементы циклом, каждый на своей строке.
Решение
n = int(input())

squares = [i ** 2 for i in range(1, n + 1)]

for s in squares:
    print(s)

Разделение «собрать» и «показать» удобно: список можно сначала получить, а потом выводить как угодно — в столбик, через пробел или частями.

9.11

Кубы в строку

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

Формат входных данных
Одна строка с числами через пробел.
Формат выходных данных
Кубы чисел через пробел.
Ввод
2 4 3
Вывод
8 64 27
Подсказка 1

split() даёт список строк — перевод в число можно сделать прямо внутри списочного выражения.

Подсказка 2

Печать в одну строку — это end=' ' в цикле или распаковка.

Разбор
  1. [int(x) ** 3 for x in input().split()] — сразу и перевод, и возведение в куб.
  2. Печатаем элементы через пробел.
Решение
cubes = [int(x) ** 3 for x in input().split()]

for c in cubes:
    print(c, end=' ')

В одном выражении здесь два действия: int() и ** 3. Это нормально, пока строка читается вслух: «взять каждый кусок, превратить в число и возвести в куб».

9.12

Слова в столбик, одной строкой

На вход подаётся строка текста, содержащая слова. Напишите программу, которая выводит слова введённой строки в столбик.

Программу можно написать в одну строку кода.

Формат входных данных
Одна строка со словами.
Формат выходных данных
Слова, каждое на отдельной строке.
Ввод
Умей ценить того кто без тебя не может
Вывод
Умей
ценить
того
кто
без
тебя
не
может
Подсказка 1

Разбить строку на слова умеет split().

Подсказка 2

А напечатать список в столбик — распаковка с sep.

Разбор
  1. input().split() даёт список слов.
  2. print(*…, sep='\n') печатает их каждое с новой строки — и всё это помещается в одну команду.
Решение
print(*input().split(), sep='\n')

Та же задача уже встречалась на прошлом занятии — и решается так же. Это не недосмотр: короткие задачи полезно решать повторно, чтобы приём стал привычным.

9.13

Только цифры

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

Формат входных данных
Одна строка.
Формат выходных данных
Цифры строки подряд, без пробелов.
Ввод 1
Число Pi примерно равно 3.1415
Вывод 1
31415
Ввод 2
123Python awesome!56
Вывод 2
12356
Подсказка 1

Списочное выражение с условием отберёт нужные символы.

Подсказка 2

Собрать их в одну строку без пробелов поможет join() с пустым разделителем.

Разбор
  1. Отбираем символы, входящие в строку '0123456789'.
  2. Склеиваем получившийся список пустым разделителем.
Решение
digits = [c for c in input() if c in '0123456789']

print(''.join(digits))

Пустая строка в роли разделителя — обычное дело: ''.join(...) просто склеивает всё подряд. Через print(*digits, sep='') вышло бы то же самое.

9.14

Квадраты чётных

На вход подаётся строка текста, содержащая целые числа. Напишите программу, использующую списочное выражение, которая выведет квадраты чётных чисел — но только те квадраты, которые не оканчиваются цифрой 4.

Попробуйте уложить программу в одну строку кода. И не забывайте про седьмой пункт «Дзена Python»: читаемость имеет значение.

Формат входных данных
Одна строка с числами через пробел.
Формат выходных данных
Подходящие квадраты через пробел.
Ввод 1
1 2 3 4 5 6 7 8 9
Вывод 1
16 36
Ввод 2
4 4 10 6 4
Вывод 2
16 16 100 36 16
Подсказка 1

Условий два: число чётное и его квадрат не оканчивается на 4.

Подсказка 2

Проверьте себя на первом примере: квадрат двойки — 4, и он отбрасывается, хотя само число чётное.

Разбор
  1. Переводим введённое в список чисел.
  2. Отбираем чётные: n % 2 == 0.
  3. Из них оставляем те, у которых квадрат не оканчивается четвёркой: n ** 2 % 10 != 4.
  4. Печатаем квадраты через пробел.
Решение
numbers = [int(x) for x in input().split()]

# отбираем чётные числа, но только те, чей квадрат не кончается на 4
squares = [n ** 2 for n in numbers if n % 2 == 0 and n ** 2 % 10 != 4]

print(*squares)

Условие задачи можно прочитать двояко: «числа, не оканчивающиеся на 4» или «квадраты, не оканчивающиеся на 4». Спор решают примеры: у первого из них в ответе нет числа 4 — квадрата двойки, — значит, проверяется именно квадрат. Когда условие допускает два чтения, примеры и есть точная формулировка.

Итог занятия

Главное с девятого занятия. Списочные методы меняют сам список и ничего не возвращают — numbers = numbers.sort() обнуляет переменную. index() и remove() останавливают программу, если значения нет: проверяйте оператором in. Списочное выражение [выражение for … in … if условие] собирает новый список одной строкой — но ровно до тех пор, пока строку можно прочитать вслух.