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]
В принципе, это всё, что я хотел рассказать вам про списки 😊
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ