Moduł kolekcji Pythona: licznik, mapa łańcuchów, deque i krotka

Opublikowany: 2020-12-01

Moduł Python Collections oferuje zestaw typów danych kontenerów, które rozszerzają funkcje kontenerów magazynowych, takich jak listy, krotki, zestawy i słowniki. Dzięki tym specjalnym pojemnikom masz nie tylko funkcje pojemników magazynowych, ale także dodatkowe metody, które są bardzo przydatne w przypadku niektórych zadań.

Pod koniec tego samouczka będziesz mieć wiedzę na temat następujących rzeczy:

  • Czym jest moduł kolekcji?
  • Różne funkcje, takie jak:
  1. Licznik
  2. Mapa łańcucha
  3. Deque
  4. Nazwana krotka
  • Przykłady pracy

Moduł Collections jest fabrycznie zainstalowany w Pythonie, więc nie musimy go instalować pip. Możemy go po prostu zaimportować i gotowe! Przyjrzyjmy się szczegółowo najczęściej używanym funkcjom.

Dowiedz się nauka nauki o danych z najlepszych światowych uniwersytetów. Zdobywaj programy Executive PG, Advanced Certificate Programs lub Masters Programs, aby przyspieszyć swoją karierę.

Trzeba przeczytać: fascynujące aplikacje Pythona w prawdziwym świecie

Spis treści

Licznik

Licznik jest najczęściej używaną i najbardziej użyteczną funkcją w module Kolekcje. Counter jest podklasą klasy słownika w Pythonie. Zlicza liczbę wystąpień każdego elementu w iterable (takim jak ciągi, krotki, listy itp.) i przechowuje go w słowniku. Klucze słownika są unikalnymi elementami w iterowalnym, a wartości są licznikami tych elementów.

Wypróbujmy to na kilku przykładach.

Importuj kolekcje
Marvel = „Zły Wolverine zastraszał biednego Iron Mana Zły Wolverine biedny biedny Iron Man”
Marvel_count = kolekcje.Licznik(Marvel.split())

#Wyjście:
Licznik({ 'Zły' : 3 ,
„Żelazo” : 2 ,
'Mężczyzna' : 2 ,
„Biedny” : 2 ,
'rosomak' : 2 ,
'znęcany' : 1 })

Jak widać, policzył wystąpienia każdego elementu i umieścił je w słowniku. Może to być używane w dowolnym typie iteracji. Zobaczmy teraz, jakie ma wszystkie metody.

Marvel_count[ „Zły” ]
#>> 3

Marvel_count.values()
#>> dict_values([3, 2, 1, 2, 2, 2])

Marvel_count.keys()
#>> dict_keys(['Zły', 'Romalak', 'znęcany', 'Żelazo', 'Człowiek', 'Biedny'])

Metoda most_common(n) zwraca listę n najczęstszych elementów ułożonych w kolejności malejącej liczby.

Marvel_count.most_common( 2 )
#>> [('Zły', 3), ('Romalak', 2)]

Mapa łańcucha

ChainMap służy do tworzenia pojedynczego widoku wielu słowników, tak aby można było uzyskać do nich dostęp i zaktualizować je z pojedynczego widoku, tj. samego obiektu ChainMap. Należy pamiętać, że te mapy łańcuchowe składają się tylko z odniesień do rzeczywistych słowników, a aktualizacja odbywa się również w samych słownikach.

ChainMap jest rozszerzeniem klasy słownika, więc obsługiwane są wszystkie metody słownikowe, plus kilka dodatkowych metod, które omówimy.

dic1 = { 'a' : 1 , 'b' : 2 }
dic2 = { 'b' : 3 , 'c' : 4 } Dic3 = { 'b' : 9 , 'd' : 4 }
chain1 = kolekcje.ChainMap(dic2, dic1)
łańcuch1

W powyższym kodzie definiujemy dwa słowniki dic1 i dic2 i umieszczamy je w obiekcie ChainMap.

#Wyjście:
ChainMap({ 'b' : 3 , 'c' : 4 }, { 'a' : 1 , 'b' : 2 })

Jak widzimy, dic2 jest „powiązany” z dic1 w tej właśnie kolejności. W skrócie, możesz sobie wyobrazić połączenie dic2 z dic1 jak dic2–>dic1. Więc kiedy szukamy klucza „b”, najpierw przeszuka pierwsze mapowanie, którym jest dic2, a jeśli klucz nie zostanie znaleziony, przejdzie do następnych mapowań.

Dlatego kolejność ChainMap jest ważna, aby określić, które mapowanie jest przeszukiwane jako pierwsze. Zobaczmy to w akcji.

łańcuch1[ 'b' ]
#>> 3

Jak widzimy powyżej, ChainMap ma klawisz 'b' w obu słownikach. Więc kiedy szukamy klucza „b”, przeszukuje on pierwsze odwzorowanie, którym jest dic2 i zwraca wartość.

atrybut map

Atrybut map ChainMap zwraca listę mapowań w kolejności wyszukiwania, tj. dic2 jest pierwszy na mapie, więc zostanie przeszukany jako pierwszy i tak dalej.

chain1.maps
#>> [{'b': 3, 'c': 4}, {'a': 1, 'b': 2}]

Podobnie możemy sprawdzić klucze i wartości:

lista(łańcuch1.klawisze())
#>> ['a', 'c', 'b']

lista(łańcuch1.wartości())
#>> [1, 4, 3]

Jak widać, wyświetlane są tylko unikalne klucze, a także wartości.

nowe_dziecko(m=Brak)

Metoda new_child() służy do dodawania nowych map do ChainMap. Ta metoda zwraca nową mapę ChainMap z nową mapą jako pierwszą mapą, po której następują pozostałe mapy. Jeśli określono m, staje się pierwszą mapą, w przeciwnym razie jako pierwsza mapa dodawany jest pusty słownik.

chain1.new_child(dic3)
chain1.maps

#Wyjście:
[{ 'b' : 9 , 'd' : 4 }, { 'b' : 3 , 'c' : 4 }, { 'a' : 1 , 'b' : 2 }]

Jak widzimy, dodał dic3 na początku i zwrócił nowy obiekt ChainMap.

wywrócony

Być może zastanawiasz się, jak zmienić kolejność ChainMap. Można to osiągnąć za pomocą funkcji odwróconej, która zwraca iterator do iteracji przez ChainMap w odwrotnym kierunku. Zobaczmy to w akcji.

Klawisz „b” jest teraz na wszystkich mapach. Pierwsza mapa w ChainMap ma klucz „b” o wartości 9.

łańcuch1[ 'b' ]
#>> 9

Zobaczmy, co się stanie, gdy wykonamy iterację w odwrotnym kierunku.

chain1.maps = odwrócona(chain1.maps)
łańcuch1[ 'b' ]
#>> 2

Należy pamiętać, że funkcja odwrócona tak naprawdę nie odwraca mapowania, a jedynie daje odwrócony iterator.

Przeczytaj: samouczek Pythona

Deque

Deque (wymawiane jako 'deck' ) jest rozszerzeniem list, ale podwójnie zakończonym. Deque to skrót od: Double Ended Queue, ponieważ możemy skutecznie usuwać/wyskakiwać i dołączać elementy na obu końcach Deques, w przeciwieństwie do list, w których wszystkie operacje znajdują się po prawej stronie.

deque(iterable, maxlen) przyjmuje iterowalne i zwraca obiekty deque. Posiadają również parametr maxlen, który określa górną granicę liczby elementów. Jeśli nie jest określony, deque może rosnąć w nieskończoność. Rzućmy okiem na jego zgryźliwe metody.

deq = kolekcje.deque([ 1 , 2 , 3 , 4 , 5 ], maxdł= 6 )
deq.appendleft( 8 )

#Wyjście:
deque([ 8 , 1 , 2 , 3 , 4 , 5 ])

Jak widzimy, wywołanie metody appendleft dodało element na lewym końcu. Co więcej, ponieważ zainicjalizowaliśmy go z maxlen jako 6, który osiągnął teraz, dołączenie kolejnego elementu spowoduje wyświetlenie „StopIterationError”.

Usuńmy więc lewy najbardziej wysunięty element za pomocą popleft :

deq.popleft()
#>> 8

Możemy również usunąć określony element według wartości za pomocą remove:

usuń.usuń( 5 )
#>> deque([1, 2, 3, 4])

Uwaga: wywołanie metody remove z elementem, którego nie ma w deque, spowoduje wyświetlenie „ValueError”.

Możemy wstawić dowolny element pod określonym indeksem za pomocą insert(index, element) .

deq.insert( 2 , 7 )
#>> deque([1, 2, 7, 3, 4])

Deque można odwrócić, wywołując metodę reverse .

deq.reverse()
#>> deque([4, 3, 7, 2, 1])


Deque można również obracać zgodnie z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara za pomocą metody obracania .

#Zgodnie ze wskazówkami zegaradeq.rotate( 2 )#>> deque([2, 1, 4, 3, 7])

#Anty ruchu wskazówek zegaradeq.rotate( -2 )#>> deque([4, 3, 7, 2, 1])

Nazwana krotka

namedtuple() jest świetnym udoskonaleniem zwykłego obiektu krotki w Pythonie. Nazwane krotki pozwalają nam indeksować elementy według ich nazw, a nie tylko pozycji. Możesz myśleć o nazwanych krotkach jako o tabelach z nazwą tabeli jako nazwą krotki i nazwami kolumn jako nazwami indeksów. Nazwana krotka zasadniczo przypisuje znaczenie każdemu elementowi, aby uzyskać łatwiejszy dostęp i bardziej czytelny kod.

Weźmy kilka przykładów i zrozummy, jak to działa.

Wydajność = collections.namedtuple( 'Employee_Rating' , [ 'Q1' , 'Q2' , 'Q3' , 'Q4' ])

W powyższym kodzie zdefiniowaliśmy obiekt Named Tuple „Performance” o nazwie „Employee_Rating” z nazwami pól „Q1”, „Q2”, „Q3” i „Q4”, który będzie przechowywać kwartalne oceny pracowników. Zróbmy 2 nazwane wpisy krotek w Employee_Rating.

rahul = Wydajność ( 3 , 4 , 3,5 , 4,5 )
ankit = Wydajność ( 4 , 4,5 , 4 , 4,5 )

#Wyjście:
Ocena_pracownika (Q1= 4 , Q2= 4,5 , Q3= 4 , Q4= 4,5 )
Ocena_pracownika (Q1= 3 , Q2= 4 , Q3= 3,5 , Q4= 4,5 )


Teraz, gdy stworzyliśmy 2 wpisy, możemy uzyskać do nich dostęp za pomocą nazw indeksów.

ankit.Q1
#>> 4

ankit.Q3 > rahul.Q3
#>> Prawda


Aby dodać nowe wpisy lub stworzyć nowe nazwane obiekty krotki, możemy użyć metody _make() .

Milkha = Wydajność._make([ 4 , 5 , 5 , 4,5 ])
Milkha

#Wyjście:
Ocena_pracownika (Q1= 4 , Q2= 5 , Q3= 5 , Q4= 4,5 )

Możemy edytować elementy za pomocą metody _replace na dowolnej nazwanej krotce.

rahul._replace(Q1= 2 )

#Wyjście:
Ocena_pracownika (Q1= 2 , Q2= 4 , Q3= 3,5 , Q4= 4,5 )

Zanim pójdziesz

Moduł Kolekcje posiada jeszcze kilka przydatnych funkcji, takich jak OrderedDict, defaultdict, UserList, UserString, UserDict. Upewnij się, że zapoznałeś się z funkcjami, które omówiliśmy w tym samouczku. Te typy kontenerów nie tylko ułatwiają życie, ale także poprawiają jakość pisanego kodu.

Jeśli chcesz dowiedzieć się więcej o Pythonie, nauce o danych, sprawdź program Executive PG w dziedzinie Data Science IIIT-B i upGrad, który jest stworzony dla pracujących profesjonalistów i oferuje ponad 10 studiów przypadków i projektów, praktyczne warsztaty praktyczne, mentoring z ekspertami z branży , 1 na 1 z mentorami branżowymi, ponad 400 godzin nauki i pomocy w pracy z najlepszymi firmami.

Co to jest moduł zbierania i jak jest przydatny?

Moduł kolekcji Pythona obsługuje kilka typów kontenerów. Pojemnik to obiekt używany do przechowywania różnych przedmiotów i dający środki do pobierania i iteracji zamkniętych obiektów. Dostępne są tuple, lista, słownik i inne wbudowane kontenery. Ponadto moduł Collections ma wysoce wyspecjalizowane i wydajne typy danych kontenerów, takie jak namedtuple(), deque, OrderedDict, counter itd., które znacznie przewyższają standardowe kontenery Pythona.

Czy moduł kolekcji jest niezbędnym tematem dla Pythona?

Tak, moduł kolekcji jest niezbędnym tematem podczas nauki Pythona. Zliczanie obiektów, konstruowanie kolejek i stosów, zarządzanie brakującymi kluczami w słownikach i wiele więcej są możliwe dzięki modułowi kolekcji Pythona. Typy danych i klasy kolekcji są tworzone tak, aby były wydajne i oparte na Pythonie. Są one bardzo cenne dla Twojej kariery programistycznej w Pythonie, więc poświęcenie czasu na zapoznanie się z tym modułem kolekcji jest warte twojego czasu i wysiłku. Kontenery w module Kolekcje mogą być bardzo korzystne dla projektów i modeli na poziomie biznesowym, znacznie zwiększając użyteczność ogólnych kontenerów Pythona poprzez lepszą optymalizację i szybkość wykonywania.

Jakie typy danych występują w module kolekcji?

W module zbierania jest dostępnych kilka typów danych, takich jak deque, defaultdict, namedtuple, OrderedDict, Counter, ChainMap, UserDict, UserList, UserString itp. Te typy danych mogą być używane z różnych powodów, takich jak dodawanie i usuwanie elementów z obu końca sekwencji, konstruując domyślne wartości brakujących kluczy i automatycznie dodając je do słownika. Te typy danych mogą również pomóc, zapewniając nazwane pola, które umożliwiają dostęp do elementów według nazwy przy jednoczesnym zachowaniu możliwości dostępu do elementów według indeksu, zliczania unikalnych elementów w sekwencji lub iteracji oraz traktowania kilku mapowań jako pojedynczego obiektu słownika itp.