Jak korzystać z licznika Pythona z modułu Collections

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 .subtract() odejmuje wartości odpowiadające elementom w od .

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.