288 lines
5.8 KiB
Plaintext
288 lines
5.8 KiB
Plaintext
|
{
|
||
|
"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
|
||
|
}
|