{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Software Entwicklung \n",
    "\n",
    "## Kapitel 6: Mengen und Dictionaries"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### 6.2 Dictionaries\n",
    "\n",
    "Die bereits behandelten *Listen* sind bekanntlich eine Möglichkeit, beliebige\n",
    "Werte mit Hilfe eines numerischen Zugriffsschlüssels, dem Index, zu verwalten.\n",
    "Die Werte besitzen bei Listen damit eine Reihenfolge, d.h. mathematisch gesehen ist eine\n",
    "Liste eine Abbildung $f$ von ganzzahligen Indexwerten auf eine beliebige Wertemenge $W$:\n",
    "\n",
    "$$f: N_0 \\rightarrow W$$\n",
    "\n",
    "\n",
    "Dictionaries sind nun eine weitere Möglichkeit, beliebige Werte zu verwalten. Allerdings\n",
    "verzichtet man auf die Reihenfolge zugunsten auch nicht-numerischer\n",
    "Zugriffsschlüssel aus einer Schlüsselmenge $D$:\n",
    "\n",
    "$$f: D \\rightarrow W$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Im Gegensatz zu Listen, die mit eckigen Klammern (<code>[</code> und <code>]</code>) eingefasst\n",
    "wurden, werden Dictionaries mit geschweiften Klammern (<code>{</code> und <code>}</code>) notiert.\n",
    "\n",
    "Da sich der Zugriffsschlüssel nicht mehr aus der Reihenfolge ergibt, muss er explizit angegeben\n",
    "werden. Man spricht hier von *key*-*value* Paaren. In Python werden die Paare mit einem Doppelpunkt\n",
    "getrennt, wobei *key* vor, und *value* nach dem Doppelpunkt angegeben wird.\n",
    "\n",
    "<code> \\< key \\> : \\< value \\> </code>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "dict  = {   \"BMEI\" : \"Bachelor Medizintechnik Vertiefung EI\",\n",
    "            \"BMMF\" : \"Bachelor Medizintechnik Vertiefung MF\",\n",
    "            17 : \"Hallo\",\n",
    "            True : \"Wahr\"}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Der Zugriff auf die Elemente des Dictionaries erfolgt - wie auch bei der Liste - durch\n",
    "Angabe des Zugriffsschlüssels in eckigen Klammern."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "print(dict[True])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Als Schlüssel sind nur unveränderliche Datentypen erlaubt. Listen oder Mengen sind\n",
    "demnach keine zulässigen Schlüssel."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Der <code>in</code>-Operator überprüft bei einem Dictionary, ob der angefragte Wert als\n",
    "*Schlüssel* im Dictionary enthalten ist."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "if \"BMEI\" in dict:\n",
    "    print(\"Als Schlüssel enthalten\")\n",
    "if \"Bachelor Medizintechnik Vertiefung MF\" in dict:\n",
    "    print(\"Die Werte werden nicht durchsucht, daher sollte dieser Text nicht erscheinen\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Mittels\n",
    "\n",
    "* <code>keys</code> kann eine Liste der Schlüssel\n",
    "* <code>values</code> kann eine Liste der Werte\n",
    "* <code>items</code> kann eine Liste von *key*-*value*-Tupeln\n",
    "\n",
    "extrahiert werden."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "print(list(dict.keys()))\n",
    "print(list(dict.values()))\n",
    "print(list(dict.items()))\n",
    "      "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Beim Iterieren über ein Dictionary wird die Schlüsselmenge durchlaufen."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "for element in dict:\n",
    "    print(element)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Der Zugriff auf die Werte kann dann über den Schlüssel erfolgen."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "for element in dict:\n",
    "    print(dict[element])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Oder man iteriert gleich über die Wertemenge."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "for wert in dict.values():\n",
    "    print(wert)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Das Löschen eines Eintrags in einem Dictionary erfolgt mit <code>del</code>."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "del(dict[\"BMEI\"])\n",
    "print(dict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Das gesamte Dictionary wird mit <code>clear</code> geleert."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "dict.clear()\n",
    "print(dict)"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.9.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
