9.1 Tworzenie kopii listy
Tworzenie kopii listy w Pythonie to ważne zadanie, które może być potrzebne, aby uniknąć niespodziewanych zmian w danych podczas manipulacji listami. Podczas pracy z listami ważne jest zrozumienie różnicy między płytkim (shallow
) a głębokim (deep
) kopiowaniem.
Płytkie kopiowanie
Płytka kopia tworzy nową listę, ale elementy pozostają te same (jeśli elementy są referencjami, są one kopiowane jako referencje). Można to zrobić na kilka sposobów:
Z użyciem funkcji list()
:
original = [1, 2, 3]
copy = list(original)
Użycie wycinka:
original = [1, 2, 3]
copy = original[:]
Metoda copy()
:
Głębokie kopiowanie
Głębokie kopiowanie tworzy nową listę, w której także tworzone są kopie wszystkich zagnieżdżonych obiektów. To szczególnie ważne, kiedy listy zawierają inne zmienne typy danych, takie jak inne listy. Do tego używany jest moduł copy
:
import copy
original = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(original)
Kiedy używać każdej metody
Płytkie kopiowanie jest szybsze i nadaje się, kiedy elementy listy są proste i nie wymagają duplikowania (np. stringi lub liczby). Głębokie kopiowanie jest potrzebne, kiedy elementy listy są same w sobie zmiennymi kolekcjami lub kiedy zmiany w kopii nie powinny wpływać na oryginał.
9.2 Usuwanie elementu z listy
To takie proste, a zarazem skomplikowane zadanie: usuwanie elementu(ów) z listy w pętli.
Kiedy przechodzimy przez listę za pomocą pętli for
, lista zwraca specjalny obiekt podrzędny — iterator, który jest używany przez pętlę for
, aby przejść przez wszystkie jej elementy. I jeśli w trakcie używania iteratora [pętlą for
] usunąć z listy element, iterator może działać nieprawidłowo.
Jeśli usuniesz 3-ci element, 4-ty automatycznie stanie się 3-cim. Jednak pętla for
, za pośrednictwem iteratora, przełączy się na nowy 4-ty element, który wcześniej był 5-tym. I dlatego 4-ty element zostanie pominięty.
Oto kilka metod, jak bezpiecznie usuwać elementy:
Użycie metody remove()
Jeśli dokładnie wiadomo, jaki element należy usunąć, można użyć remove()
wewnątrz pętli. Jednak to może być nieefektywne, jeśli elementów jest dużo, ponieważ każdy wywołanie remove()
szuka elementu przed usunięciem, co spowalnia wykonanie.
Tworzenie nowej listy
Bezpieczniejszym sposobem jest stworzenie nowej listy tylko z tymi elementami, które chcesz zachować:
original_list = [1, 2, 3, 4, 5, 6]
new_list = [x for x in original_list if x % 2 != 0] # zachowujemy tylko nieparzyste liczby
Użycie indeksów
Można użyć pętli for
z odwróconym indeksem, aby usunąć elementy bez ryzyka pominięcia:
for i in range(len(original_list) - 1, -1, -1):
if original_list[i] % 2 == 0: # warunek do usunięcia
del original_list[i]
Kiedy przechodzimy po liście od końca, to podczas usuwania elementów zmieniają się tylko indeksy już przejrzanych elementów.
Użycie kopii listy:
Załóżmy, że chcesz usunąć wszystkie liczby ujemne z listy:
numbers = [1, -1, 2, -2, 3, -3]
# Tworzymy kopię listy do bezpiecznej iteracji
for number in numbers.copy():
if number < 0:
numbers.remove(number)
print(numbers) # Wyświetli [1, 2, 3]
9.3 Łączenie list
Bardzo często trzeba połączyć dwie lub więcej list w jedną. Można to zrobić na kilka sposobów, każdy z nich nadaje się do różnych zadań i ma swoje cechy.
Użycie operatora +
Najprostszy sposób połączenia dwóch list to użycie operatora +
. To bezpośrednia i intuicyjna metoda:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = list1 + list2
print(combined_list) # Wyświetli [1, 2, 3, 4, 5, 6]
Metoda extend()
Metoda extend()
modyfikuje pierwszą listę, dodając na jej końcu wszystkie elementy drugiej listy. To zmienia pierwotną listę:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)
print(list1) # Wyświetli [1, 2, 3, 4, 5, 6]
Skróty list (List Comprehensions)
Skróty list mogą być używane do tworzenia nowych list poprzez łączenie elementów z kilku list w jedną złożoną listę:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = [item for sublist in [list1, list2] for item in sublist]
print(combined_list) # Wyświetli [1, 2, 3, 4, 5, 6]
Metoda append()
Można dodać wszystkie elementy 2-giej listy do 1-szej pojedynczo. No, jako opcja.
list1 = [1, 2, 3]
list2 = [4, 5, 6]
for x in list2:
list1.append(x)
print(list1) # Wyświetli [1, 2, 3, 4, 5, 6]
W zasadzie to wszystko, co chciałem Wam opowiedzieć o listach 😊
GO TO FULL VERSION