W tym samouczku dowiesz się, jak używać obiektu counter z modułu kolekcji Pythona.
Kiedy pracujesz z długimi sekwencjami w Pythonie, powiedzmy, listami lub ciągami znaków Pythona, czasami możesz potrzebować zapisać elementy, które pojawiają się w sekwencji, oraz liczbę ich wystąpień.
Słownik Pythona jest odpowiednią wbudowaną strukturą danych dla takich aplikacji. Jednak klasa Counter języka Python z modułu collections może to uprościć — konstruując licznik — który jest słownikiem elementów i ich liczby w sekwencji.
W ciągu następnych kilku minut dowiesz się, co następuje:
- Użyj obiektu licznika Pythona
- Utwórz słownik Pythona do przechowywania wartości liczbowych elementów w iterowalnym
- Przepisz słownik, używając licznika Pythona z uproszczoną składnią
- Wykonuj operacje, takie jak aktualizacja i odejmowanie elementów, znajdowanie przecięcia między dwoma obiektami licznika
- Uzyskaj najczęstsze elementy w liczniku za pomocą metody most_common().
Zacznijmy!
Python Collections Moduł i klasa licznika
Często będziesz używać słownika Pythona do przechowywania elementów i ich liczby w iteracji. Elementy i liczba są przechowywane odpowiednio jako klucze i wartości.
Ponieważ klasa Counter jest częścią wbudowanego modułu Pythona collections, możesz ją zaimportować do swojego skryptu Pythona w następujący sposób:
from collections import Counter
Po zaimportowaniu klasy Counter, jak wspomniano, możesz utworzyć instancję obiektu licznika, jak pokazano:
<counter_object> = Counter(iterable)
Tutaj:
- iterowalna to dowolna poprawna iterowalna Python, taka jak lista Pythona, ciąg znaków lub krotka.
- Elementy w iterowalności powinny być hashowalne.
Teraz, gdy wiemy, jak używać licznika do tworzenia obiektów licznika z dowolnej iterowalnej wersji Pythona, zacznijmy kodować.
Przykłady użyte w tym samouczku można znaleźć w tym GitHub Gist.
Jak utworzyć obiekt licznika z Pythona Iterables
Stwórzmy łańcuch Pythona, powiedzmy „renesans” i nazwijmy go słowem.
>>> word = "renaissance"
Naszym celem jest stworzenie słownika, w którym każda litera w łańcuchu słów jest odwzorowywana na liczbę wystąpień w ciągu. Jednym ze sposobów jest użycie pętli for, jak pokazano:
>>> letter_count = {} >>> for letter in word: ... if letter not in letter_count: ... letter_count[letter] = 0 ... letter_count[letter] += 1 ... >>> letter_count {'r': 1, 'e': 2, 'n': 2, 'a': 2, 'i': 1, 's': 2, 'c': 1}
Przeanalizujmy, co robi powyższy fragment kodu:
- Inicjuje letter_count do pustego słownika Pythona.
- Zapętla łańcuch słów.
- Sprawdza, czy litera występuje w słowniku letter_count.
- Jeśli litera nie jest obecna, dodaje ją z wartością 0, a następnie zwiększa wartość o 1.
- Dla każdego wystąpienia litery w słowie wartość odpowiadająca literze jest zwiększana o 1.
- Trwa to, dopóki nie przejdziemy przez cały łańcuch.
Skonstruowaliśmy słownik liczba_liter — samodzielnie — używając pętli for do przechodzenia przez łańcuch znaków.
Teraz użyjmy klasy Counter z modułu collections. Musimy tylko przekazać łańcuch słów do funkcji Counter(), aby uzyskać wartość letter_count bez konieczności przechodzenia przez iteracje w pętli.
>>> from collections import Counter >>> letter_count = Counter(word) >>> letter_count Counter({'e': 2, 'n': 2, 'a': 2, 's': 2, 'r': 1, 'i': 1, 'c': 1})
Obiekt licznika jest również słownikiem Pythona. Możemy użyć wbudowanej funkcji isinstance(), aby to sprawdzić:
>>> isinstance(letter_count,dict) True
Jak widać, isinstance(letter_count, dict) zwraca True, wskazując, że obiekt licznika letter_count jest instancją klasy dict Pythona.
Modyfikowanie obiektu licznika
Do tej pory nauczyliśmy się tworzyć obiekty liczników z łańcuchów Pythona.
Możesz także modyfikować obiekty licznika, aktualizując je elementami z innej iterowalności lub odejmując od nich inną iterowalność.
Aktualizowanie licznika elementami z innego elementu iterowalnego
Zainicjujmy kolejny łańcuch inny_słowo:
>>> another_word = "effervescence"
Załóżmy, że chcielibyśmy zaktualizować obiekt licznika liczba_liter o pozycje z ciągu innego_słowa.
Możemy użyć metody update() na obiekcie licznika letter_count.
>>> letter_count.update(another_word) >>> letter_count Counter({'e': 7, 'n': 3, 's': 3, 'c': 3, 'r': 2, 'a': 2, 'f': 2, 'i': 1, 'v': 1})
Na wyjściu widzimy, że obiekt licznika został zaktualizowany, aby zawierał również litery i liczbę ich wystąpień z innego_słowa.
Odejmowanie elementów od innego obiektu iterowalnego
Odejmijmy teraz wartość other_word od obiektu letter_count. W tym celu możemy użyć metody subtract(). Użycie
Odejmijmy inne_słowo od ilości_liter.
>>> letter_count.subtract(another_word) >>> letter_count Counter({'e': 2, 'n': 2, 'a': 2, 's': 2, 'r': 1, 'i': 1, 'c': 1, 'f': 0, 'v': 0})
Widzimy, że wartości odpowiadające literom w innym słowie zostały odjęte, ale dodane klucze „f” i „v” nie zostały usunięte. Odwzorowują teraz na wartość 0.
Uwaga: Tutaj przekazaliśmy innym_słowo, ciąg Pythona, do wywołania metody subtract() . Możemy również przekazać obiekt licznika Pythona lub inny obiekt iterowalny.
Przecięcie między dwoma licznikami w Pythonie
Czasami możesz chcieć znaleźć punkt przecięcia między dwoma licznikami Pythona, aby określić, które klucze są wspólne dla tych dwóch.
Utwórzmy obiekt licznika, powiedzmy, liczba_liter_2, z ciągu innego_słowa 'musowanie’.
>>> another_word = "effervescence" >>> letter_count_2 = Counter(another_word) >>> letter_count_2 Counter({'e': 5, 'f': 2, 'c': 2, 'r': 1, 'v': 1, 's': 1, 'n': 1})
Możemy użyć prostego operatora &, aby znaleźć punkt przecięcia między letter_count i letter_count_2.
>>> letter_count & letter_count_2 Counter({'e': 2, 'r': 1, 'n': 1, 's': 1, 'c': 1})
Zwróć uwagę, w jaki sposób uzyskujesz klucze i liczbę wystąpień wspólnych dla tych dwóch słów. Zarówno „renesans”, jak i „musowanie” zawierają dwa wystąpienia „e” i po jednym wspólnym wystąpieniu „r”, „n”, „s” i „c”.
Znajdź najczęstsze przedmioty, używając mostu_powszechnego
Inną powszechną operacją na obiekcie licznika Pythona jest znalezienie najczęściej występujących elementów.
Aby uzyskać listę k najczęstszych elementów licznika, możesz użyć metody most_common() na obiekcie licznika. Tutaj wywołujemy most_common() na wartość letter_count, aby znaleźć trzy najczęściej występujące litery.
>>> letter_count.most_common(3) [('e', 2), ('n', 2), ('a', 2)]
Widzimy, że litery „e”, „n” i „a” występują dwukrotnie w słowie „renesans”.
Jest to szczególnie przydatne, jeśli licznik zawiera dużą liczbę wpisów i chcesz pracować z najczęściej używanymi klawiszami.
Wniosek
Oto krótki przegląd tego, czego nauczyliśmy się w samouczku:
- Klasa Counter z wbudowanego modułu Pythona collections może być użyta do uzyskania słownika wartości zliczeń wszystkich elementów w dowolnej iterowalności. Powinieneś upewnić się, że wszystkie elementy w iterowalności są hashowalne.
- Możesz zaktualizować zawartość jednego obiektu licznika Pythona zawartością innego obiektu licznika lub dowolnego innego obiektu iterowalnego, używając metody update() o składni: counter1.update(counter2). Zauważ, że możesz użyć dowolnego iterowalnego zamiast counter2.
- Jeśli chcesz usunąć zawartość jednej z iteracji ze zaktualizowanego licznika, możesz użyć metody subtract(): counter1.subtract(counter2).
- Aby znaleźć wspólne elementy między dwoma obiektami licznika, możesz użyć operatora &. Biorąc pod uwagę dwa liczniki counter1 i counter2, counter1 & counter2 zwraca część wspólną tych dwóch liczników.
- Aby uzyskać k najczęstszych elementów w liczniku, możesz użyć metody most_common(). counter.most_common(k) podaje k najczęstszych elementów i odpowiednie liczby.
Następnie naucz się używać domyślnego dict, innej klasy w module collections. Możesz użyć domyślnego dict zamiast zwykłego słownika Pythona do obsługi brakujących kluczy.