{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Buchstaben-Häufigkeit\n",
        "\n",
        "jbusse\n",
        "\n",
        "**Gegeben:** ein String. Wie oft kommt jeder Buchstabe vor?"
      ],
      "id": "8fc96b4b-3544-4760-8c75-b502c262fa4e"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/plain": [
              "'Hallo Otto!'"
            ]
          }
        }
      ],
      "source": [
        "text = \"Hallo Otto!\"\n",
        "text"
      ],
      "id": "4b0b69f5"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Ein String lässt sich sehr leicht in eine Liste von Buchstaben\n",
        "übersetzen:"
      ],
      "id": "f7ee49bd-e21e-4407-90aa-9d6d57be5bba"
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/plain": [
              "['H', 'a', 'l', 'l', 'o', ' ', 'O', 't', 't', 'o', '!']"
            ]
          }
        }
      ],
      "source": [
        "list(text)"
      ],
      "id": "91089b1b"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "In der Tat ergeben die folgenden zwei Schleifen das identische Ergebnis:"
      ],
      "id": "9906db2c-672a-42f0-9301-3c5c99c7d9b6"
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "H-a-l-l-o- -O-t-t-o-!-"
          ]
        }
      ],
      "source": [
        "for c in list(text):\n",
        "    print(c, end=\"-\")"
      ],
      "id": "db4f7d7e"
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "H-a-l-l-o- -O-t-t-o-!-"
          ]
        }
      ],
      "source": [
        "for c in text:\n",
        "    print(c, end=\"-\")"
      ],
      "id": "67b5f10c"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "**Gesucht:** Wir wollen zählen, wie oft jeder einzelne Buchstabe, jedes\n",
        "einzelne Zeichen in diesem String auftaucht. Das Ergebnis wollen wir in\n",
        "einem Dict `zaehlung` festhalten, das ungefähr so aussieht:"
      ],
      "id": "930f7acd-7c75-437f-a854-836fe629608c"
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/plain": [
              "{'H': 1, 'l': 3, Ellipsis: Ellipsis}"
            ]
          }
        }
      ],
      "source": [
        "zaehlung = { \"H\": 1, \"l\": 3, ...:... }\n",
        "zaehlung"
      ],
      "id": "10b169f7"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Schritt 1: Wir wollen das Set `schluessel` als die Menge der Zeichen\n",
        "erzeugen, die in dem String `quelle` vorkommen. Die Elemente dieser\n",
        "Menge ergeben dann auch die Schlüssel aus unserem Dict `ergebnis`."
      ],
      "id": "d549ebd4-2f85-43e7-ab07-008db7214e35"
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/plain": [
              "{'l': 0, 'a': 0, 'o': 0, 'O': 0, ' ': 0, '!': 0, 'H': 0, 't': 0}"
            ]
          }
        }
      ],
      "source": [
        "quelle = \"Hallo Otto!\"\n",
        "\n",
        "schluessel = set(list(quelle))\n",
        "\n",
        "ergebnis = {}\n",
        "# Die Werte aus unserem Dikt-Ergebnis mit 0 initialisieren. \n",
        "for s in schluessel:\n",
        "    ergebnis[s] = 0\n",
        "\n",
        "ergebnis"
      ],
      "id": "89ddf446"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Nun gehen wir durch unseren Strings durch: Die Variable `c` –kurz für\n",
        "Charakter – nimmt nacheinander jeden Buchstaben aus unserem Eingabetext\n",
        "`quelle` an. Der Ausdruck `ergebnis[c]` gibt uns Zugriff auf den Wert\n",
        "zum Schlüssel `c` aus unserem Dict `ergebnis`. Wir erhöhen den bisher\n",
        "vorgefundenen Wert (anfangs nach Initialisierung `0`) um `1`. (Und wir\n",
        "drucken die Variablen zur Kontrolle aus, hier in einer fancy Syntax,\n",
        "kommt später):"
      ],
      "id": "fc4b6b70-aa35-4ed7-9eea-31f1cb70e609"
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "c='H', ergebnis[H]= 1\n",
            "c='a', ergebnis[a]= 1\n",
            "c='l', ergebnis[l]= 1\n",
            "c='l', ergebnis[l]= 2\n",
            "c='o', ergebnis[o]= 1\n",
            "c=' ', ergebnis[ ]= 1\n",
            "c='O', ergebnis[O]= 1\n",
            "c='t', ergebnis[t]= 1\n",
            "c='t', ergebnis[t]= 2\n",
            "c='o', ergebnis[o]= 2\n",
            "c='!', ergebnis[!]= 1"
          ]
        },
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/plain": [
              "{'l': 2, 'a': 1, 'o': 2, 'O': 1, ' ': 1, '!': 1, 'H': 1, 't': 2}"
            ]
          }
        }
      ],
      "source": [
        "for c in quelle:\n",
        "    ergebnis[c] = ergebnis[c] + 1\n",
        "\n",
        "    # print mit f-string\n",
        "    print(f\"{c=}, ergebnis[{c}]= {ergebnis[c]}\")\n",
        "\n",
        "ergebnis"
      ],
      "id": "a786d018"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Zusammengefasst:"
      ],
      "id": "c1f9a64c-4779-4865-ac0c-9efef85d923a"
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "schluessel: {'l', 'a', 'o', 'O', ' ', '!', 'H', 't'}\n",
            "ergebnis: {'l': 2, 'a': 1, 'o': 2, 'O': 1, ' ': 1, '!': 1, 'H': 1, 't': 2}"
          ]
        }
      ],
      "source": [
        "quelle = \"Hallo Otto!\"\n",
        "ergebnis = {}\n",
        "\n",
        "schluessel = set(list(quelle))\n",
        "print(\"schluessel:\", schluessel)\n",
        "\n",
        "# Dict ergebnis: Werte mit 0 initialisieren\n",
        "# konservativ:\n",
        "#\n",
        "# for s in schluessel:\n",
        "#    ergebnis[s] = 0\n",
        "#\n",
        "# eleganter mit Dict-Comprehension:\n",
        "#\n",
        "ergebnis = { s: 0  for s in schluessel }\n",
        "\n",
        "# durch quelle durchgehen\n",
        "for c in list(quelle):\n",
        "    # auf den bisherigen Wert 1 draufaddieren\n",
        "    ergebnis[c] = ergebnis[c] + 1\n",
        "\n",
        "print(\"ergebnis:\", ergebnis)"
      ],
      "id": "a9435153"
    }
  ],
  "nbformat": 4,
  "nbformat_minor": 5,
  "metadata": {
    "jupytext": {
      "notebook_metadata_filter": "jupytext",
      "text_representation": {
        "extension": ".qmd",
        "format_name": "quarto",
        "format_version": "1.0",
        "jupytext_version": "1.19.5"
      }
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3 (ipykernel)",
      "language": "python"
    },
    "language_info": {
      "name": "python",
      "codemirror_mode": {
        "name": "ipython",
        "version": "3"
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.12.3"
    }
  }
}