U ovom vodiču istražićemo kako se koristi objekat brojača iz Python-ovog modula collections.
Prilikom rada sa dugim sekvencama u Python-u, kao što su liste ili stringovi, često se javlja potreba za praćenjem pojavljivanja pojedinačnih stavki i njihovog broja.
Python-ov rečnik je zgodna struktura podataka za ovakve zadatke. Ipak, Python-ova klasa Counter iz modula collections može pojednostaviti ovaj proces. Ona kreira brojač – rečnik koji sadrži stavke i njihovu frekvenciju pojavljivanja.
U narednim minutama naučićete:
- Kako koristiti Python-ov Counter objekat
- Kako kreirati Python rečnik za skladištenje broja pojavljivanja stavki u nizu
- Kako prevesti rečnik u Python brojač sa pojednostavljenom sintaksom
- Kako izvršavati operacije kao što su ažuriranje i oduzimanje elemenata, te pronalaženje preseka između dva brojača
- Kako dobiti najčešće stavke u brojaču koristeći metod most_common()
Krenimo!
Python Collections Modul i Counter Klasa
Python rečnik se često koristi za skladištenje stavki i njihovog broja u nekom iterabilnom objektu. Stavke se čuvaju kao ključevi, a njihov broj kao vrednosti.
Pošto je Counter klasa deo Python-ovog ugrađenog modula collections, možete je uključiti u svoj kod na sledeći način:
from collections import Counter
Nakon uvoza klase Counter, instanciranje objekta brojača se vrši na sledeći način:
<counter_object> = Counter(iterable)
Gde:
- iterable predstavlja bilo koji važeći Python iterabilni objekat poput liste, stringa ili torke.
- Stavke unutar iterabilnog objekta moraju biti hashable.
Sada kada razumemo kako da kreiramo Counter objekte iz Python iterabilnih objekata, pređimo na kodiranje.
Primeri korišćeni u ovom vodiču dostupni su na ovom GitHub repozitorijumu.
Kako kreirati objekat brojača iz Python iterabilnih objekata
Kreirajmo Python string, recimo, ‘renesansa’ i nazovimo ga „reč“.
>>> word = "renaissance"
Naš cilj je da napravimo rečnik u kojem je svako slovo u reči mapirano na broj pojavljivanja u stringu. Jedan od načina je upotreba for petlje, kao što je prikazano:
>>> 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}
Hajde da analiziramo šta radi gornji kod:
- Inicijalizuje letter_count kao prazan Python rečnik.
- Prolazi kroz string „word“.
- Proverava da li je slovo prisutno u rečniku letter_count.
- Ako slovo nije prisutno, dodaje ga sa početnom vrednošću 0, a zatim je inkrementira za 1.
- Za svako pojavljivanje slova u reči, vrednost odgovarajućeg slova se uvećava za 1.
- Ovaj proces se nastavlja dok se ne prođe kroz ceo string.
Uspešno smo kreirali rečnik letter_count ručno, koristeći for petlju.
Sada ćemo koristiti klasu Counter iz modula collections. Potrebno je samo proslediti string „word“ u Counter() da bismo dobili letter_count bez for petlje.
>>> 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})
Objekat brojača je takođe Python rečnik. Možemo koristiti ugrađenu funkciju isinstance() da ovo potvrdimo:
>>> isinstance(letter_count,dict) True
Kao što vidimo, isinstance(letter_count, dict) vraća True, što znači da je letter_count objekat instance klase Python dict.
Modifikacija objekta Counter
Do sada smo naučili kako kreirati objekte brojača od Python stringova.
Takođe možete modifikovati Counter objekte ažuriranjem elementima iz drugog iterabilnog objekta, ili oduzimanjem elemenata drugog iterabilnog objekta.
Ažuriranje brojača elementima iz drugog iterabilnog objekta
Inicijalizujmo još jedan string, „another_word“:
>>> another_word = "effervescence"
Pretpostavimo da želimo da ažuriramo objekat brojača letter_count sa stavkama iz stringa „another_word“.
Možemo koristiti metod update() na objektu brojača 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})
U izlazu vidimo da je objekat brojača ažuriran tako da uključuje slova i njihove frekvencije iz stringa „another_word“.
Oduzimanje elemenata od drugog iterabilnog objekta
Sada, oduzmimo frekvenciju pojavljivanja „another_word“ od letter_count objekta. Za to koristimo metod subtract(). Korišćenjem <counter-object>.subtract(<some-iterable>) oduzimaju se vrednosti frekvencija pojavljivanja stavki u <some-iterable> od <counter-object>.
Oduzmimo „another_word“ od „letter_count“.
>>> 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})
Vidimo da su vrednosti odgovarajućih slova u „another_word“ oduzete, ali dodatni ključevi ‘f’ i ‘v’ nisu uklonjeni. Sada su mapirani na vrednost 0.
Napomena: Ovde smo prosledili „another_word“, Python string, pozivu metode subtract(). Takođe možemo proslediti Python Counter objekat ili neki drugi iterabilni objekat.
Presek između dva Counter objekta u Python-u
Ponekad je potrebno pronaći presek između dva Python Counter objekta da bi se identifikovali ključevi koji su zajednički za oba.
Napravimo objekat brojača, recimo, letter_count_2, od stringa „another_word“, ‘effervescence’.
>>> 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žemo koristiti jednostavan & operator da pronađemo presek između letter_count i letter_count_2.
>>> letter_count & letter_count_2 Counter({'e': 2, 'r': 1, 'n': 1, 's': 1, 'c': 1})
Obratite pažnju kako se dobijaju ključevi i brojevi pojavljivanja koji su zajednički za obe reči. I ‘renesansa’ i ‘effervescence’ sadrže po dva pojavljivanja ‘e’ i po jedno pojavljivanje ‘r’, ‘n’, ‘s’, i ‘c’.
Pronalaženje najčešćih stavki koristeći most_common
Još jedna česta operacija sa Python Counter objektima je pronalaženje stavki koje se najčešće pojavljuju.
Da biste dobili prvih k najčešćih stavki u brojaču, možete koristiti metod most_common() na objektu brojača. Ovde pozivamo most_common() na letter_count da bismo dobili tri najčešća slova.
>>> letter_count.most_common(3) [('e', 2), ('n', 2), ('a', 2)]
Vidimo da se slova ‘e’, ‘n’ i ‘a’ pojavljuju po dva puta u reči ‘renesansa’.
Ovo je posebno korisno ako brojač sadrži veliki broj unosa i ako vas zanima rad sa najčešćim ključevima.
Zaključak
Evo kratkog pregleda onoga što smo naučili u ovom vodiču:
- Klasa Counter iz Python-ovog modula collections može se koristiti za dobijanje rečnika koji broji pojavljivanja svih stavki u bilo kom iterabilnom objektu. Treba osigurati da su sve stavke u iterabilnom objektu hashable.
- Možete ažurirati sadržaj jednog Python Counter objekta sadržajem drugog Counter objekta ili bilo kog drugog iterabilnog objekta pomoću metode update() sa sintaksom: counter1.update(counter2). Umesto counter2, može se koristiti bilo koji iterabilni objekat.
- Ako želite da uklonite sadržaj jednog iterabilnog objekta od ažuriranog brojača, možete koristiti metod subtract(): counter1.subtract(counter2).
- Da biste pronašli zajedničke elemente između dva Counter objekta, možete koristiti & operator. Za dva brojača counter1 i counter2, counter1 & counter2 vraća presek ova dva Counter objekta.
- Da biste dobili k najčešćih stavki u brojaču, možete koristiti metod most_common(). counter.most_common(k) vraća k najčešćih stavki i njihovu frekvenciju pojavljivanja.
Zatim, naučite kako da koristite defaultdict, još jednu klasu u modulu collections. Možete koristiti defaultdict umesto običnog Python rečnika za rukovanje nedostajućim ključevima.