O funkcji Zip
Jak wspomniano wcześniej, funkcja „zip” służy do tworzenia par z elementów wielu iterowalnych obiektów. Rozważ poniższy przykład, aby zrozumieć podstawową składnię i użycie funkcji zip:
lista1 = ["a", "b", "c"]list2 = ["jabłko", "piłka", "kot"]
zip = zip(lista1, lista2)
drukuj (lista (skompresowana))
Pierwsze dwie instrukcje w powyższym przykładzie kodu definiują dwie listy zawierające pewne elementy. Następnie wykorzystywana jest funkcja „zip”, przekazując jako argumenty zmienne „list1” i „list2”. To jest główna składnia funkcji „zip”. Musisz tylko przekazać listy lub inne poprawne uporządkowane iterable jako argumenty, których elementy chcesz połączyć. Na koniec, instrukcja print służy do uzyskania danych wyjściowych „skompresowanej” zmiennej. Po uruchomieniu przykładowego kodu wspomnianego powyżej, powinieneś otrzymać następujące dane wyjściowe:
[('a', 'jabłko'), ('b', 'piłka'), ('c', 'kot')]Zauważ, że funkcja „zip” zwraca obiekt typu „zip”, a nie listę. Musisz przekonwertować go na typ iterowalny, jak pokazano w powyższym oświadczeniu print.
Mówiąc prościej, funkcja „zip” pobiera elementy tego samego indeksu z dwóch list i łączy je w parę w krotkę. Tak więc 0. element z „lista1” jest łączony z 0. elementem „lista2”, pierwszy element z „listy1” jest łączony z pierwszym elementem „lista2” i tak dalej. Funkcja zip przesuwa się od lewej do prawej, a krotka zawierająca sparowane elementy ma ten sam indeks, co elementy w nich przechowywane.
Używanie ZIP, gdy elementy iterowalne nie mają takiej samej liczby elementów
W powyższym przykładzie obie listy mają równą liczbę elementów. W przypadku, gdy masz do czynienia z jakimś kodem, w którym obie listy nie mają tej samej liczby elementów, funkcja „zip” zatrzyma się na ostatnim elemencie listy mającym najmniejszą liczbę elementów.
W poniższym przykładzie funkcja „zip” zatrzyma się na elemencie „c”, niezależnie od tego, czy „list2” ma jeszcze jeden element.
lista1 = ["a", "b", "c"]list2 = ["jabłko", "piłka", "kot", "lalka"]
zip = zip(lista1, lista2)
drukuj (lista (skompresowana))
Po uruchomieniu przykładowego kodu wspomnianego powyżej, powinieneś otrzymać następujące dane wyjściowe:
[('a', 'jabłko'), ('b', 'piłka'), ('c', 'kot')]Możesz użyć więcej niż dwóch iterable podczas korzystania z funkcji Zip
Zwykle funkcja „zip” służy do porównywania dwóch iterowalnych obiektów. Możesz jednak przekazać dowolną liczbę iteracji jako argumenty do funkcji „zip”. Zasada zatrzymania się na ostatnim elemencie najkrótszej listy będzie nadal obowiązywać list.
lista1 = ["a", "b", "c"]list2 = ["jabłko", "piłka", "kot", "lalka"]
lista3 = ["5", "3"]
zip = zip(lista1, lista2, lista3)
drukuj (lista (skompresowana))
Po uruchomieniu przykładowego kodu wspomnianego powyżej, powinieneś otrzymać następujące dane wyjściowe:
[('a', 'jabłko', '5'), ('b', 'piłka', '3')]Tworzenie indywidualnych list z obiektu typu Zip
Jeśli masz już obiekt „zip”, możesz go użyć do ponownego wypełnienia poszczególnych list, które były wcześniej używane, gdy funkcja zip była na nich wywoływana po raz pierwszy.
lista1 = ["a", "b", "c"]list2 = ["jabłko", "piłka", "kot", "lalka"]
lista3 = ["5", "3"]
zip = zip(lista1, lista2, lista3)
l1, l2, l3 = zip(*zip)
drukuj (lista(l1), lista(l2), lista(l3))
Po uruchomieniu przykładowego kodu wspomnianego powyżej, powinieneś otrzymać następujące dane wyjściowe:
['a', 'b'] ['jabłko', 'piłka'] ['5', '3']W powyższym przykładzie kodu obiekt „zip” jest korygowany za pomocą operatora „*”. Nieprecyzyjne wyniki są następnie przekazywane do innego wywołania funkcji zip, która tworzy oryginalne listy. Pamiętaj, że możesz nie odzyskać wszystkich elementów z oryginalnych list, jeśli listy o nierównej długości zostały użyte podczas tworzenia obiektu „zip” po raz pierwszy.
Używanie ZIP, gdy chcesz zachować elementy z najdłuższych iterowalności
W wielu powyższych przykładach mogłeś zauważyć, że funkcja „zip” domyślnie zatrzymuje się na ostatnim elemencie najkrótszej iterowalnej. Co zrobić, jeśli chcesz, aby kontynuował iterację, aż osiągnie ostatni element najdłuższej iteracji??
W takim przypadku będziesz musiał użyć metody „zip_longest()” z modułu „itertools” Pythona. Działa tak samo jak funkcja „zip”, z jedną niewielką różnicą, że zatrzymuje się na ostatnim elemencie najdłuższego typu iterowalnego.
z itertools import zip_longestlista1 = ["a", "b", "c"]
list2 = ["jabłko", "piłka", "kot", "lalka"]
lista3 = ["5", "3"]
zip = zip_longest(lista1, lista2, lista3)
drukuj (lista (skompresowana))
Po uruchomieniu przykładowego kodu wspomnianego powyżej, powinieneś otrzymać następujące dane wyjściowe:
[('a', 'jabłko', '5'), ('b', 'piłka', '3'), ('c', 'kot', Brak), (Brak, 'lalka', Brak) ]Brakujące wartości są wypełniane jako obiekty typu „Brak”. Możesz również podać własną wartość do wypełnienia, przekazując dodatkowy argument „fillvalue” do metody „zip_longest”.
z itertools import zip_longestlista1 = ["a", "b", "c"]
list2 = ["jabłko", "piłka", "kot", "lalka"]
lista3 = ["5", "3"]
zip = zip_longest(lista1, lista2, lista3, fillvalue="moja_wartość")
drukuj (lista (skompresowana))
Po uruchomieniu przykładowego kodu wspomnianego powyżej, powinieneś otrzymać następujące dane wyjściowe:
[('a', 'jabłko', '5'), ('b', 'piłka', '3'), ('c', 'kot', 'moja_wartość'), ('moja_wartość', 'lalka ', 'moja_wartość')]Wniosek
Funkcja zip może być emulowana za pomocą niektórych pętli i instrukcji warunków. Pomaga jednak w utrzymaniu porządku i czystości kodu, usuwając niepotrzebną gadatliwość i powtarzające się instrukcje.