JavaRush /Курсы /Модуль 1: Python Core /Практическая работа со списками

Практическая работа со списками

Модуль 1: Python Core
5 уровень , 8 лекция
Открыта

9.1 Создание копии списка

Создание копии списка в Python — важная задача, которая может потребоваться для избежания неожиданных изменений в данных при манипуляциях со списками. При работе со списками важно понимать различие между поверхностным (shallow) и глубоким (deep) копированием.

Поверхностное копирование

Поверхностная копия создает новый список, но элементы остаются теми же (если элементы являются ссылками, они копируются как ссылки). Это можно сделать несколькими способами:

С помощью функции list():


original = [1, 2, 3]
copy = list(original)

Использование среза:


original = [1, 2, 3]
copy = original[:]

Метод copy():

Глубокое копирование

Глубокое копирование создает новый список, в котором также создаются копии всех вложенных объектов. Это особенно важно, когда списки содержат другие изменяемые типы данных, как другие списки. Для этого используется модуль copy:


import copy
original = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(original)

Когда использовать каждый метод

Поверхностное копирование быстрее и подходит, когда элементы списка простые или не требуют дублирования (например, строки или числа). Глубокое копирование необходимо, когда элементы списка сами по себе являются изменяемыми коллекциями или когда изменения в копии не должны отражаться на оригинале.

9.2 Удаление элемента из списка

Есть такая простая и сложная задача одновременно: удаление элемента(ов) из списка в цикле.

Когда мы проходимся по списку с помощью цикла for, то список возвращает специальный дочерний объект — итератор, который используется циклом for, чтобы обойти все его элементы. И если в процессе использования итератора [циклом for] удалить из списка элемент, то итератор может работать неправильно.

Если вы удалили 3-й элемент, то 4-й автоматически станет 3-м. А вот цикл for, посредством итератора, переключится на новый 4-й элемент, который раньше был 5-м. И стало быть 4-й элемент будет пропущен.

Вот несколько методов, как безопасно удалять элементы:

Использование метода remove()

Если точно известно, какой элемент нужно удалить, можно использовать remove() внутри цикла. Однако это может быть неэффективно, если элементов много, так как каждый вызов remove() ищет элемент перед удалением, что замедляет выполнение.

Создание нового списка

Более безопасный способ — создать новый список только с теми элементами, которые нужно сохранить:


original_list = [1, 2, 3, 4, 5, 6]
new_list = [x for x in original_list if x % 2 != 0]  # сохраняем только нечетные числа

Использование индексов

Можно использовать цикл for с обратным индексом, чтобы удалить элементы без риска пропуска:


for i in range(len(original_list) - 1, -1, -1):
    if original_list[i] % 2 == 0:  # условие для удаления
        del original_list[i]

Когда мы идем по списку с конца, то при удалении элементов меняются индексы только уже пройденных элементов.

Использование копии списка:

Допустим, вы хотите удалить все отрицательные числа из списка:


numbers = [1, -1, 2, -2, 3, -3]
# Создаем копию списка для безопасной итерации
for number in numbers.copy():
    if number < 0:
        numbers.remove(number)
print(numbers) # Выведет [1, 2, 3]

9.3 Объединение списков

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

Использование оператора +

Самый простой способ объединить два списка — использовать оператор +. Это прямой и интуитивно понятный метод:


list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = list1 + list2
print(combined_list)  # Выведет [1, 2, 3, 4, 5, 6]

Метод extend()

Метод extend() модифицирует первый список, добавляя в его конец все элементы второго списка. Это изменяет исходный список:


list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)
print(list1)  # Выведет [1, 2, 3, 4, 5, 6]

Списковые включения (List Comprehensions)

Списковые включения могут быть использованы для создания новых списков путём объединения элементов из нескольких списков в один сложный список:


list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = [item for sublist in [list1, list2] for item in sublist]
print(combined_list)  # Выведет [1, 2, 3, 4, 5, 6]

Метод append()

Можно добавить все элементы 2-го списка в 1-й по одному. Ну, как вариант.


list1 = [1, 2, 3]
list2 = [4, 5, 6]
for x in list2:
    list1.append(x)
print(list1)  # Выведет [1, 2, 3, 4, 5, 6]

В принципе, это всё, что я хотел рассказать вам про списки 😊

2
Задача
Модуль 1: Python Core, 5 уровень, 8 лекция
Недоступна
Сортировка без сортировки
Сортировка без сортировки
2
Задача
Модуль 1: Python Core, 5 уровень, 8 лекция
Недоступна
Чистим список
Чистим список
1
Опрос
Списки в Python, 5 уровень, 8 лекция
Недоступен
Списки в Python
Списки в Python
Комментарии (13)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
25 октября 2025
В задаче "чистим список" при проверке пишет что не нужно создавть новый отфильрованный список и выводить его, а в верном решении создают новый список и выводят его 😆
Slevin Уровень 64
24 июня 2025
Почините 6й вопрос викторины. Неправильно написаны варианты ответов.
VasliyD Уровень 11
9 мая 2025
Почему в вопросе "Что возвращает выражение my_list[1:4]?" ответ "с 2 по 4 эл-т включительно" считается неверным? my_list[1] - это второй эл-т по счёту, my_list[3] - четвёртый. Что не так? UPD Понятно, имелись ввиду индексы элементов, а не фактический номер по порядку, начиная с первого.
Slevin Уровень 64
24 июня 2025
У вас справедливая претензия, в ответе написано "Элементы, а не индексы". Ошибка в викторине
Peter Уровень 12
1 сентября 2025
Вчерашние студенты опросник делали, 100%
SWK Уровень 26
21 марта 2025

В принципе, это всё, что я хотел рассказать вам про списки 😊
Такое ощущение, что автор рассказывать вообще ничего не хотел, но его немножко пытали...
STRIK Уровень 8
17 марта 2025
Во второй задачке прислушался к лекции)) "Более безопасный способ — создать новый список только с теми элементами, которые нужно сохранить:"... не пропустило ответ, хотя решение правильное(( (по условию понятно что через ремув нужно, а не создание списка, но, а вдруг...)
_den Уровень 52
18 февраля 2025
для тех кто как я пытался сделать в одну строку copy() и sort() и не понял, почему выходит None

copy_list = rand_list.copy().sort()
метод .sort() не возвращает новый список, то есть в copy_list ничего не запишется.
Дмитрий Уровень 27
15 февраля 2025
В лекции 7 в разделе про генерацию списков умножением стоит, наверное, предупредить о неприятных граблях при умножении элементов, которые сами являются списками. Они в этом случае не генерируются, а лишь получают клонированные ссылки на тот же самый элемент; и при изменении одного элемента изменятся и все остальные. Если пример из лекции 7: alist = [[0] * 10] * 20 print(alist) # выведет [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], ...] слегка продолжить: alist[0][0] = 5 print(alist) то можно обнаружить, что поменялись первые элементы во всех вложенных списках. [[5, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0...]
_den Уровень 52
18 февраля 2025
если сделать deepcopy, то всё равно меняются все вложенные)
SWK Уровень 26
21 марта 2025
Фееричненько. Подозреваю, если сделать deepcopy, то при изменении одного подмассива в оригинале не будут меняться значения в [дип]копии, а в копии строчки (или столбики?) тоже получатся клонированными.
Максим (upsarin) Уровень 34
25 декабря 2024
В опросе про my_list[1:4] неправильный ответ
Евгений Уровень 21
7 января 2025
Двоякая ситуация. У нас же элементы считаются с нуля. Я бы сказал не совсем понятно сформулирован вопрос.