Chcąc dodać elementy do listy w Pythonie możemy użyć jednej w dwóch metod: append i extend. Jakie są między nimi różnice i jakie efekty pozwalają uzyskać? Poznaj obie, by osiągać zamierzony efekt i uniknąć zaskoczenia. Zacznijmy od przykładu.
Tworzymy bardzo prostą listę trójelementową, zawierającą wydatki z trzech kolejnych dni:
lista = [10, 23, 15]
# lista
# [10, 23, 15]
Chcąc dodać do listy wydatek z kolejnego dnia, czyli kolejny element, możemy użyć metody append:
lista.append(9)
# lista
# [10, 23, 15, 9]
Niewiele nas tu zaskakuje. A jeśli chcemy dodać więcej niż jeden element naraz, np. gdy dodajemy wydatki za kilka dni? Spróbujmy:
lista.append([56, 16])
# lista
# [10, 23, 15, 9, [56, 16]]
Cóż, nie do końca o to nam chodziło. Może chcielibyśmy zrobić sumę wydatków za ten tydzień, zobaczyć jaką najwyższą, a jaką najniższą kwotę wydaliśmy. Z tak zagnieżdżoną strukturą sprawa niepotrzebnie by się skomplikowała. Czy można zatem dodać kilka elementów do listy, bez zagnieżdżania jej struktury? Jak najbardziej. Z pomocą przyjdzie nam funkcja extend, która dodaje elementy do listy dodatkowo spłaszczając strukturę:
lista = [10, 23, 15]
# lista
# [10, 23, 15]lista.extend([9, 56, 16])
# lista
# [10, 23, 15, 9, 56, 16]
Czyli efekt odpowiada naszym założeniom. Możemy teraz korzystać z kilku wbudowanych funkcji licząc np. sumę albo maximum:
sum(lista)
# 129
max(lista)
# 56
Podsumowując:
Funkcja append służy do dodawania pojedynczych elementów. Jej argumentem może być dowolny element, który zostanie dołożony do listy. W elemencie nie będzie żadnej zmiany struktury. Pamiętajmy, że możliwe jest dodanie nie tylko typów prostych (jak int, float, boolean), ale również złożonych jak inna lista, słownik czy obiekt.
Z kolei funkcja extend jest bardziej wybredna. Za argument przyjmie jedynie element, który jest iterowalny (iterable) np. listę, krotkę lub string. Jeśli podamy argument nieiterowalny np. int, dostaniemy błąd:
lista.extend(10)# Odpowiedź interpretera:
Traceback (most recent call last):
File "", line 1, in
TypeError: 'int' object is not iterable
Pułapki
Ponieważ funkcja extend przyjmuje typy iterowalne, możemy bez protestów interpretera dodać do listy ciąg znaków, ale efekt może być zupełnie inny niż zamierzaliśmy...:
dziennik = ['Jan', 'Ania', 'Justyna', 'Tomek']# dziennik
# ['Jan', 'Ania', 'Justyna', 'Tomek']# dodajemy jeszcze jedno imię do dziennika:
dziennik.extend('Ola')# dziennik
# ['Jan', 'Ania', 'Justyna', 'Tomek', 'O', 'l', 'a']
Nie o to nam przecież chodziło. Tutaj potrzebujemy użyć funkcji append:
dziennik = ['Jan', 'Ania', 'Justyna', 'Tomek']# dziennik
# ['Jan', 'Ania', 'Justyna', 'Tomek']dziennik.append('Ola')
# dziennik
# ['Jan', 'Ania', 'Justyna', 'Tomek', 'Ola']
Warto nauczyć się różnic w obsłudze extend i append na prostszych przykładach. Im dalej w las tym więcej drzew, a w bardziej skomplikowanych strukturach (np. dziennik z ocenami uczniów z różnych przedmiotów) odkrycie błędu może nam zająć więcej czasu.
Jeśli masz dodatkowe pytania lub własny przykład pomyłki z extend oraz append, pisz w komentarzach!
Szkoda, że nastała tutaj taka cisza. Bardzo fajny blog ;)
Już niedługo coś się pojawi :)