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]
В принципі, це все, що я хотів розповісти вам про списки 😊
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ