Jak používat Pythonův čítač z modulu Kolekce

V tomto tutoriálu se naučíte, jak používat objekt čítače z modulu kolekce Pythonu.

Když v Pythonu pracujete s dlouhými sekvencemi, řekněme s Pythonovými seznamy nebo řetězci, možná budete někdy potřebovat uložit položky, které se v sekvenci objeví, a kolikrát se objeví.

Pythonský slovník je vhodnou vestavěnou datovou strukturou pro takové aplikace. Třída Counter v Pythonu z modulu collections to však může zjednodušit – vytvořením čítače – což je slovník položek a jejich počtu v sekvenci.

Během několika následujících minut se naučíte následující:

  • Použijte objekt čítače Pythonu
  • Vytvořte pythonovský slovník pro ukládání hodnot počtu položek v iterovatelné
  • Přepište slovník pomocí čítače Pythonu se zjednodušenou syntaxí
  • Provádějte operace, jako je aktualizace a odečítání prvků, nalezení průsečíku mezi dvěma objekty čítače
  • Získejte nejčastější položky v počítadle pomocí metody most_common().

Začněme!

Modul Python Collections a Counter Class

K ukládání položek a jejich počtu v iterovatelném slovníku budete často používat slovník Pythonu. Položky a počet jsou uloženy jako klíče a hodnoty.

Protože je třída Counter součástí vestavěného modulu kolekcí Pythonu, můžete ji importovat do skriptu Python takto:

from collections import Counter

Po importu třídy Counter, jak je uvedeno, můžete vytvořit instanci objektu čítače, jak je znázorněno:

<counter_object> = Counter(iterable)

Tady:

  • iterable je jakýkoli platný iterovatelný Python, jako je seznam Python, řetězec nebo n-tice.
  • Položky v iterovatelném by měly být hašovatelné.

Nyní, když víme, jak použít Counter k vytvoření objektů čítače z libovolného iterovatelného Pythonu, začněme kódovat.

Příklady použité v tomto tutoriálu naleznete v tomto GitHubu.

Jak vytvořit objekt Counter z Python Iterables

Vytvořme řetězec Python, řekněme, ‚renaissance‘ a nazvěme jej slovo.

>>> word = "renaissance"

Naším cílem je vytvořit slovník, kde je každé písmeno v řetězci slov mapováno na počet výskytů v řetězci. Jedním přístupem je použití pro smyčky, jak je znázorněno:

>>> 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}

Pojďme analyzovat, co dělá výše uvedený fragment kódu:

  • Inicializuje letter_count do prázdného slovníku Pythonu.
  • Prochází řetězec slov.
  • Zkontroluje, zda je písmeno přítomno ve slovníku letter_count.
  • Pokud písmeno není přítomno, přidá jej s hodnotou 0 a následně hodnotu zvýší o 1.
  • Pro každý výskyt písmene ve slově se hodnota odpovídající toletteru zvýší o 1.
  • Takto to pokračuje, dokud nepropleteme celý řetězec.

Vytvořili jsme slovník počtu písmen – sami – pomocí smyčky for pro procházení řetězcem slova.

Nyní použijeme třídu Counter z modulu collections. Potřebujeme pouze předat řetězec slova do Counter(), abychom získali letter_count, aniž bychom museli procházet iterables.

>>> 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})

Objekt čítače je také slovník Pythonu. K ověření můžeme použít vestavěnou funkci isinstance():

>>> isinstance(letter_count,dict)
True

Jak je vidět, isinstance(počet_písmen, dict) vrací True, což znamená, že objekt čítače počet_písmen je instancí třídy Python dict.

Úprava objektu čítače

Zatím jsme se naučili vytvářet objekty čítačů z řetězců Pythonu.

Objekty čítače můžete také upravit tak, že je aktualizujete prvky z jiné iterovatelné nebo od nich odečtete jinou iterovatelnou.

Aktualizace počítadla prvky z jiného iterovatelného

Inicializujeme další řetězec other_word:

>>> another_word = "effervescence"

Předpokládejme, že bychom chtěli aktualizovat objekt počítadla letter_count položkami z řetězce other_word.

Můžeme použít metodu update() na objektu čítače 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})

Ve výstupu vidíme, že objekt čítače byl aktualizován tak, aby zahrnoval také písmena a jejich počet výskytů z jiného_slova.

Odečítání prvků z jiného iterovatelného

Nyní odečteme hodnotu other_word od objektu letter_count. K tomu můžeme použít metodu subtract(). Pomocí .subtract() odečte hodnoty odpovídající položkám v od .

Odečteme další_slovo od počtu_písmen.

>>> 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})

Vidíme, že hodnoty odpovídající písmenům v other_word byly odečteny, ale přidané klíče ‚f‘ a ‚v‘ nebyly odstraněny. Nyní se mapují na hodnotu 0.

Poznámka: Zde jsme předali další_slovo, řetězec Pythonu, do volání metody subtract(). Můžeme také předat objekt čítače Pythonu nebo jiný iterovatelný objekt.

Průnik mezi dvěma objekty čítače v Pythonu

Někdy možná budete chtít najít průsečík mezi dvěma objekty čítače Pythonu, abyste zjistili, které klíče jsou mezi nimi společné.

Vytvořme objekt čítače, řekněme, počet_2, z řetězce jiného slova ‚šumění‘.

>>> 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})

Můžeme použít operátor simple & k nalezení průsečíku mezi letter_count a letter_count_2.

>>> letter_count & letter_count_2
Counter({'e': 2, 'r': 1, 'n': 1, 's': 1, 'c': 1})

Všimněte si, jak získáte klíče a počet společných výskytů těchto dvou slov. Jak ‚renaissance‘, tak ‚šumění‘ obsahují dva výskyty ‚e‘ a jeden společný výskyt ‚r‘, ‚n‘, ‚s‘ a ‚c‘.

Najděte nejčastější položky pomocí most_common

Další běžnou operací na objektu čítače Pythonu je nalezení nejčastěji se vyskytujících položek.

Chcete-li získat prvních k nejběžnějších položek v čítači, můžete použít metodu most_common() na objektu čítače. Zde zavoláme most_common() na letter_count, abychom našli tři nejčastěji se vyskytující písmena.

>>> letter_count.most_common(3)
[('e', 2), ('n', 2), ('a', 2)]

Vidíme, že písmena „e“, „n“ a „a“ se ve slově „renesance“ vyskytují dvakrát.

To je zvláště užitečné, pokud počítadlo obsahuje velké množství záznamů a máte zájem pracovat s nejběžnějšími klíči.

Závěr

Zde je rychlý přehled toho, co jsme se naučili v tutoriálu:

  • Třídu Counter z vestavěného modulu kolekcí Pythonu lze použít k získání slovníku hodnot počtu všech položek v libovolné iteraci. Měli byste se ujistit, že všechny položky v iterovatelné jsou hašovatelné.
  • Obsah jednoho objektu čítače Pythonu můžete aktualizovat obsahem jiného objektu čítače nebo jakéhokoli jiného iterovatelného pomocí metody update() se syntaxí: counter1.update(counter2). Všimněte si, že místo čítače2 můžete použít libovolnou iterovatelnou.
  • Pokud chcete odstranit obsah jedné z iterovatelných položek z aktualizovaného čítače, můžete použít metodu subtract(): counter1.subtract(counter2).
  • Chcete-li najít společné prvky mezi dvěma objekty čítače, můžete použít operátor &. Jsou-li dány dva čítače čítač1 a čítač2, čítač1 a čítač2 vrací průnik těchto dvou objektů čítače.
  • Chcete-li získat k nejčastějších položek v počítadle, můžete použít metodu most_common(). counter.most_common(k) udává k nejběžnějších položek a příslušné počty.

Dále se naučte, jak používat výchozí dict, další třídu v modulu kolekcí. Ke zpracování chybějících klíčů můžete použít výchozí dict místo běžného slovníku Pythonu.