Программирование и IT
Python: списки
Список — изменяемый упорядоченный набор значений произвольных типов. Он же главный источник неожиданностей у начинающих: присваивание не копирует список, sort ничего не возвращает, а удаление элементов прямо в цикле пропускает половину. Разберём по порядку.
В этой статье
Как создать и что внутри#
Список записывается в квадратных скобках; элементы могут быть разных типов, и
это нормально, хотя в реальном коде однородный список удобнее.
=
=
=
# 3 3 2
Индексация с нуля, отрицательные индексы считают с конца: -1 — последний
элемент. Обращение за границу даёт IndexError, а не пустое значение.
Добавить и убрать#
=
# ['a', 'b', 'c']
# ['a', 'b', 'c', 'd', 'e']
# ['a', 'x', 'b', 'c', 'd', 'e']
# убирает ПЕРВОЕ вхождение
= # 'e', список стал короче
# ['a', 'b', 'c', 'd'] e
Разницу между append и extend стоит запомнить сразу: первый кладёт аргумент
одним элементом, второй раскрывает его по элементам.
=
# [1, 2, [3, 4]]
=
# [1, 2, 3, 4]
remove бросает ValueError, если значения нет, а pop(i) — IndexError при
неверном индексе. Чтобы удалить по индексу без возврата значения, есть del items[0].
Сортировка: sort и sorted#
=
# ['дыня', 'слива', 'Арбуз']
# ['слива', 'дыня', 'Арбуз']
# None
# ['Арбуз', 'дыня', 'слива']
Метод sort меняет список на месте и возвращает None — строка
words = words.sort() превращает список в None, и это частая ошибка. Функция
sorted возвращает новый список и работает с любой последовательностью.
Аргумент key задаёт, по какому значению сравнивать: key=len — по длине,
key=str.lower — без учёта регистра. Заглавная буква сравнивается по коду
символа и потому оказывается раньше строчных: Арбуз встал перед дыня.
Сортировка устойчива — равные по ключу элементы сохраняют исходный порядок:
в примере с key=len пятибуквенные слива и Арбуз остались в том же
порядке, что были.
Копирование: присваивание не копирует#
=
=
# [1, 2, 3, 4] — изменился и a
= # или list(a), или a[:]
# [1, 2, 3, 4] [1, 2, 3, 4, 5]
b = a даёт второе имя тому же объекту. Настоящая копия — a.copy(), list(a)
или срез a[:]. Но все три копии поверхностные: вложенные списки останутся
общими.
=
=
= 9
# [[9, 0], [0, 0]]
Для глубокой копии берут copy.deepcopy. По той же причине опасна запись
grid = [[0] * 3] * 3: внешний список получает три ссылки на одну строку, и
grid[0][0] = 1 меняет все три. Правильно — [[0] * 3 for _ in range(3)].
Списочные выражения и перебор#
=
# [0, 1, 4, 9, 16]
# [0, 4, 16]
# 1 a / 2 b
Списочное выражение читается как «что собрать — из чего — при каком условии» и
почти всегда короче цикла с append.
Отдельная ловушка — менять список, пока по нему идёт цикл:
=
# [1, 2, 3] — одна двойка уцелела
Цикл идёт по индексам, а список после удаления сдвинулся. Правильный приём —
собрать новый список: nums = [n for n in nums if n != 2].
Задание для закрепления: из списка оценок [4, 5, 3, 5, 4, 2] получи список
без повторов, отсортированный по убыванию, и отдельно — количество оценок выше
тройки. Оба ответа умещаются в одну строку каждый.
Соседние темы: срезы для выборки кусков и
словари, когда нужен доступ по ключу, а не по номеру.
План по этапам
- Создать и обойтиСписок из десяти чисел, печать длины, первого и последнего элемента, перебор через enumerate.
- Пять методов измененияappend, extend, insert, remove, pop — после каждого печатать список и видеть разницу.
- Сортировка тремя способамиsort, sorted, sorted с key=len; убедиться, что sort вернул None.
- Эксперимент с копиейb = a и c = a.copy(): изменить каждую и сравнить, что стало с a.
- Переписать цикл выражениемЗаменить цикл с append на списочное выражение с условием.
Начать изучать эту тему у себя
План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.
Проверь себя
1.Что выведет: a = [1, 2]; a.append([3, 4]); print(len(a))?
2.Что выведет print([1, 2, 3].sort())?
3.Что выведет: a = [1, 2]; b = a; b.append(3); print(a)?
4.Чему равно len([x for x in range(10) if x % 3 == 0])?
Источники
-
Структуры данных в учебнике PythonМетоды списка, списочные выражения, стек и очередьбесплатно
-
Встроенные типы: последовательностиСправочник операций над list и другими последовательностямибесплатно
-
StepikБесплатные курсы по Python с автопроверкойбесплатно
Было полезно?