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
Комментарии (17)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
PaPaY Уровень 13
17 марта 2026
from random import randint my_list = [randint(1, 20) for i in range(1, 11)] print(my_list) for i in range(len(my_list) - 1, -1, -1): if my_list[i] % 2 == 0: # условие для удаления del my_list[i] print(my_list)
Александр Уровень 22
15 января 2026
"numbers = [1, -1, 2, -2, 3, -3] # Создаем копию списка для безопасной итерации for number in numbers.copy(): if number < 0: numbers.remove(number) print(numbers) # Выведет [1, 2, 3]" -> GPT: В чем «подвох» (Минусы)  -- Низкая скорость (\(O(n^{2})\)): Метод .remove() каждый раз ищет элемент с начала списка, а затем сдвигает все оставшиеся элементы. [2] На маленьком списке это незаметно, но на списке из 100 000 чисел это будет работать очень долго. -- Дубликаты: Если в списке будут две одинаковые отрицательные цифры (например, [-1, -1]), .remove() всегда удаляет первое вхождение, а не то, на котором сейчас находится цикл.
Fat.Lilliput Уровень 15
6 января 2026
хорошо бы в лекции напомнить, что значит

for i in range(len(original_list) - 1, -1, -1):
А именно:

range(start, stop, step)
т.е начиная с последнего элемента, до первого (т. к stop - не включительно) с шагом 1 назад. Это, конечно, было уже описано, но напомнить было бы не лишним
Максим Уровень 33
21 декабря 2025
Сперва ругается на создание нового списка, не пропускает мой ответ. Спустя 20 минут битья об лёд, "покупаю ответ" - ругается на создание нового списка.... Браво!
25 октября 2025
В задаче "чистим список" при проверке пишет что не нужно создавть новый отфильрованный список и выводить его, а в верном решении создают новый список и выводят его 😆
Slevin Уровень 59
24 июня 2025
Почините 6й вопрос викторины. Неправильно написаны варианты ответов.
VasliyD Уровень 11
9 мая 2025
Почему в вопросе "Что возвращает выражение my_list[1:4]?" ответ "с 2 по 4 эл-т включительно" считается неверным? my_list[1] - это второй эл-т по счёту, my_list[3] - четвёртый. Что не так? UPD Понятно, имелись ввиду индексы элементов, а не фактический номер по порядку, начиная с первого.
Slevin Уровень 59
24 июня 2025
У вас справедливая претензия, в ответе написано "Элементы, а не индексы". Ошибка в викторине
Peter Уровень 6
1 сентября 2025
Вчерашние студенты опросник делали, 100%
SWK Уровень 26
21 марта 2025

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

copy_list = rand_list.copy().sort()
метод .sort() не возвращает новый список, то есть в copy_list ничего не запишется.