{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Counter\n", "\n", "Keeps track of number of times an item is added." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from collections import Counter" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Counter({'b': 3, 'a': 2, 'c': 1})\n", "Counter({'c': 3, 'b': 2, 'a': 1})\n", "Counter({'b': 3, 'a': 2, 'c': 1})\n" ] } ], "source": [ "print(Counter(['a', 'a', 'b', 'b', 'b', 'c']))\n", "\n", "# Notice that in the following cases of dict and kwargs, a new Counter\n", "# is created with the given number and no \"counting\" happens\n", "print(Counter({ 'a': 1, 'b': 2, 'c': 3}))\n", "print(Counter(a=2, b=3, c=1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Empty counter can be created and later items added." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Counter({'a': 1})\n", "Counter({'a': 2})\n", "Counter({'b': 4, 'a': 2, 'c': 2})\n" ] } ], "source": [ "empty = Counter()\n", "\n", "empty.update('a')\n", "print(empty)\n", "\n", "empty.update('a')\n", "print(empty)\n", "\n", "empty.update('bbbbcc')\n", "print(empty)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Counts of an item can be retrieved by simply indexing." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of 'b': 4\n" ] } ], "source": [ "print(\"Number of 'b':\", empty['b'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "❗️ Counter returns count of `0` for non-existent keys." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of 'z': 0\n" ] } ], "source": [ "print(\"Number of 'z':\", empty['z'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ⭐️ `most_common(n)`\n", "\n", "Returns `n` most common items as a sequence of pairs. If `n` is not provided, returns all in decreasing order." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Top 3 letters in the dictionary:\n", "e : 235331\n", "i : 201032\n", "a : 199554\n" ] } ], "source": [ "c = Counter()\n", "\n", "with open('/usr/share/dict/words', 'r') as f:\n", " for line in f:\n", " c.update(line.rstrip().lower())\n", "\n", "print(\"Top 3 letters in the dictionary:\")\n", "for item, count in c.most_common(3):\n", " print(f\"{item} : {count}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Set and arithmetic operations" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "c1 + c2 = Counter({'a': 5, 'b': 5, 'e': 5, 'c': 3, 'd': 1})\n", "c1 - c2 = Counter({'e': 5, 'a': 3})\n", "c1 | c2 = Counter({'e': 5, 'a': 4, 'b': 3, 'c': 2, 'd': 1})\n", "c1 & c2 = Counter({'b': 2, 'a': 1, 'c': 1})\n" ] } ], "source": [ "c1 = Counter(a=4, b=2, c=1, d=0, e=5)\n", "c2 = Counter(a=1, b=3, c=2, d=1)\n", "\n", "print(\"c1 + c2 =\", c1 + c2)\n", "print(\"c1 - c2 =\", c1 - c2) # NOTE: 0 counts and -ve counts are removed\n", "\n", "print(\"c1 | c2 =\", c1 | c2) # NOTE: Largest counts are preserved\n", "print(\"c1 & c2 =\", c1 & c2) # NOTE: Smallest counts are preserved" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Some extra APIs" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a : 2\n", "a : 2\n", "b : 4\n", "b : 4\n", "b : 4\n", "b : 4\n", "c : 3\n", "c : 3\n", "c : 3\n", "d : 1\n" ] } ], "source": [ "c = Counter('aabbbbcccd')\n", "\n", "# Get an iterator to loop through\n", "# NOTE: Does not return count == 0 items\n", "for el in c.elements():\n", " print(f\"{el} : {c[el]}\")" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total items = 5\n" ] } ], "source": [ "print(\"Total items =\", Counter('aaabb').total())" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "interpreter": { "hash": "9e0fd7424d8281b91a098a189d6ae37333be9d5a00ec75c9d3dec88c73652714" }, "kernelspec": { "display_name": "Python 3.10.1 ('leetcode-yPz04C5d')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.1" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }