{"id":3176,"date":"2025-09-21T19:48:36","date_gmt":"2025-09-21T17:48:36","guid":{"rendered":"https:\/\/davidka.net\/ru\/?p=3176"},"modified":"2025-09-22T09:08:49","modified_gmt":"2025-09-22T07:08:49","slug":"collections-in-python","status":"publish","type":"post","link":"https:\/\/de.davidka.net\/de\/2025\/09\/21\/collections-in-python\/","title":{"rendered":"\ud83d\udcd8 Sammlungen in Python"},"content":{"rendered":"\n<p class=\"has-neve-link-hover-color-color has-text-color has-link-color has-medium-font-size wp-elements-1793e0f3d0d22aa6d75a004fc7f28386 wp-block-paragraph\">In Python ist eine <strong>Sammlung<\/strong> ein Objekt, das eine <strong>Gruppe von Elementen<\/strong> enth\u00e4lt und es erm\u00f6glicht, mit ihnen als Einheit zu arbeiten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sammlungen unterst\u00fctzen typischerweise:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Iteration (<code class=\"\" data-line=\"\">for element in sammlung<\/code>)<\/li>\n\n\n\n<li>Mitgliedschaftspr\u00fcfung (<code class=\"\" data-line=\"\">x in sammlung<\/code>)<\/li>\n\n\n\n<li>L\u00e4ngenbestimmung (<code class=\"\" data-line=\"\">len(sammlung)<\/code>)<\/li>\n\n\n\n<li>Zugriff per Index oder Schl\u00fcssel (wenn geordnet oder assoziativ)<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Python hat keine strikte \u201eSammlungs-Schnittstelle\u201c, folgt aber informellen Protokollen. Wenn ein Objekt <code class=\"\" data-line=\"\">__iter__<\/code>, <code class=\"\" data-line=\"\">__len__<\/code>, <code class=\"\" data-line=\"\">__contains__<\/code> implementiert, gilt es als Sammlung.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Was KEINE Sammlung ist<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Folgende Typen sind <strong>keine Sammlungen<\/strong>, da sie keine Gruppen von Elementen enthalten:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">int<\/code>, <code class=\"\" data-line=\"\">float<\/code>, <code class=\"\" data-line=\"\">bool<\/code> \u2014 Skalarwerte<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">None<\/code> \u2014 Fehlen eines Werts<\/li>\n\n\n\n<li>Funktionen, Module, Klassen \u2014 sind Objekte, aber keine Datencontainer (es sei denn, sie enthalten <code class=\"\" data-line=\"\">__dict__<\/code>)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Eingebaute Sammlungen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ohne Import verf\u00fcgbar:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Typ<\/th><th>Beschreibung<\/th><\/tr><\/thead><tbody><tr><td><code class=\"\" data-line=\"\">list<\/code><\/td><td>Geordnete, ver\u00e4nderbare Sequenz.<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">tuple<\/code><\/td><td>Geordnete, unver\u00e4nderbare Sequenz.<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">dict<\/code><\/td><td>Geordnete Schl\u00fcssel-Wert-Zuordnung (seit Python 3.7).<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">set<\/code><\/td><td>Ungeordnete Sammlung eindeutiger Elemente.<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">frozenset<\/code><\/td><td>Unver\u00e4nderbare Version von <code class=\"\" data-line=\"\">set<\/code>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Erweiterte Sammlungen aus der Standardbibliothek<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Typ<\/th><th>Modul<\/th><th>Zweck<\/th><\/tr><\/thead><tbody><tr><td><code class=\"\" data-line=\"\">SimpleNamespace<\/code><\/td><td><code class=\"\" data-line=\"\">types<\/code><\/td><td>Objekt mit dynamischen Attributen (Alternative zu dict mit Punktzugriff).<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">namedtuple<\/code><\/td><td><code class=\"\" data-line=\"\">collections<\/code><\/td><td>Unver\u00e4nderbares Tupel mit benannten Feldern.<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">deque<\/code><\/td><td><code class=\"\" data-line=\"\">collections<\/code><\/td><td>Doppelseitige Warteschlange \u2014 effizient f\u00fcr Operationen an beiden Enden.<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">Counter<\/code><\/td><td><code class=\"\" data-line=\"\">collections<\/code><\/td><td>Subklasse von dict zum Z\u00e4hlen von Objekten.<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">defaultdict<\/code><\/td><td><code class=\"\" data-line=\"\">collections<\/code><\/td><td>W\u00f6rterbuch mit Standardwerten f\u00fcr fehlende Schl\u00fcssel.<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">dataclass<\/code><\/td><td><code class=\"\" data-line=\"\">dataclasses<\/code><\/td><td>Generiert automatisch <code class=\"\" data-line=\"\">__init__<\/code>, <code class=\"\" data-line=\"\">__repr__<\/code>, <code class=\"\" data-line=\"\">__eq__<\/code> usw.<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">UserList<\/code><\/td><td><code class=\"\" data-line=\"\">collections<\/code><\/td><td>Basisklasse f\u00fcr benutzerdefinierte Listen.<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">UserDict<\/code><\/td><td><code class=\"\" data-line=\"\">collections<\/code><\/td><td>Basisklasse f\u00fcr benutzerdefinierte W\u00f6rterb\u00fccher.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Andere sammlungs\u00e4hnliche Typen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Obwohl nicht immer \u201eSammlungen\u201c genannt, repr\u00e4sentieren oder speichern diese Typen ebenfalls Datengruppen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. <code class=\"\" data-line=\"\">str<\/code> \u2014 Zeichenkette<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Geordnete, unver\u00e4nderbare Sequenz von Zeichen.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">s = &quot;Python&quot;\nprint(len(s))        # \u2192 6\nprint(s&#091;0])          # \u2192 P\nprint(&#039;y&#039; in s)      # \u2192 True\nprint(list(s))       # \u2192 &#091;&#039;P&#039;, &#039;y&#039;, &#039;t&#039;, &#039;h&#039;, &#039;o&#039;, &#039;n&#039;]<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2. <code class=\"\" data-line=\"\">bytes<\/code>, <code class=\"\" data-line=\"\">bytearray<\/code><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">bytes<\/code> \u2014 unver\u00e4nderbare Byte-Sequenz.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">bytearray<\/code> \u2014 ver\u00e4nderbare Version.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">b = b&quot;hallo&quot;\nprint(b&#091;0])          # \u2192 104\nprint(len(b))        # \u2192 5\n\nba = bytearray(b&quot;hallo&quot;)\nba&#091;0] = 72\nprint(ba)            # \u2192 bytearray(b&#039;Hallo&#039;)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3. <code class=\"\" data-line=\"\">range<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Faule, geordnete Zahlenfolge. Speichert Elemente nicht im Speicher.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">r = range(3)\nprint(list(r))       # \u2192 &#091;0, 1, 2]\nprint(1 in r)        # \u2192 True\nprint(r&#091;2])          # \u2192 2<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4. <code class=\"\" data-line=\"\">array.array<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Speichert homogene numerische Daten kompakt (wie in C).<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from array import array\narr = array(&#039;i&#039;, &#091;1, 2, 3])  # &#039;i&#039; = signed int\nprint(arr)                   # \u2192 array(&#039;i&#039;, &#091;1, 2, 3])<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">5. Generatoren und Iteratoren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Speichern keine Daten \u2014 generieren sie bei Bedarf. Unterst\u00fctzen weder <code class=\"\" data-line=\"\">len()<\/code> noch Indexierung.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">gen = (x * 2 for x in range(3))\nprint(list(gen))     # \u2192 &#091;0, 2, 4]\n# len(gen) \u2192 TypeError<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">6. <code class=\"\" data-line=\"\">ChainMap<\/code> (aus <code class=\"\" data-line=\"\">collections<\/code>)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Gruppiert mehrere Dictionaries in einer einzigen Sicht \u2014 Suche durchl\u00e4uft Maps in Reihenfolge.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from collections import ChainMap\n\nd1 = {&#039;a&#039;: 1}\nd2 = {&#039;b&#039;: 2}\ncm = ChainMap(d1, d2)\nprint(cm&#091;&#039;a&#039;])       # \u2192 1\nprint(cm&#091;&#039;b&#039;])       # \u2192 2<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">7. <code class=\"\" data-line=\"\">OrderedDict<\/code> (aus <code class=\"\" data-line=\"\">collections<\/code>)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dictionary, das Einf\u00fcgereihenfolge beibeh\u00e4lt. Relevant f\u00fcr Python < 3.7.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks line-numbers\"><code class=\" language-python\" data-line=\"\">from collections import OrderedDict\n\nod = OrderedDict([(&#039;a&#039;, 1), (&#039;b&#039;, 2)])\nprint(od)            # \u2192 OrderedDict([(&#039;a&#039;, 1), (&#039;b&#039;, 2)])<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">8. <code class=\"\" data-line=\"\">enum.Enum<\/code>, <code class=\"\" data-line=\"\">enum.Flag<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sammlungen benannter Konstanten.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks line-numbers\"><code class=\" language-python\" data-line=\"\">from enum import Enum\n\nclass Farbe(Enum):\n    ROT = 1\n    GRUEN = 2\n\nprint(list(Farbe))   # \u2192 [&lt;Farbe.ROT: 1&gt;, &lt;Farbe.GRUEN: 2&gt;]<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">9. <code class=\"\" data-line=\"\">typing.NamedTuple<\/code>, <code class=\"\" data-line=\"\">typing.TypedDict<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Typisierte Wrapper um <code class=\"\" data-line=\"\">namedtuple<\/code> und <code class=\"\" data-line=\"\">dict<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from typing import NamedTuple, TypedDict\n\nclass Person(NamedTuple):\n    name: str\n    alter: int\n\np = Person(&quot;Anna&quot;, 25)\n\nclass Film(TypedDict):\n    titel: str\n    jahr: int\n\nm: Film = {&quot;titel&quot;: &quot;Matrix&quot;, &quot;jahr&quot;: 1999}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">10. <code class=\"\" data-line=\"\">heapq<\/code>, <code class=\"\" data-line=\"\">bisect<\/code> \u2014 Werkzeuge, keine Sammlungen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Arbeiten mit Sammlungen, sind aber keine:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">heapq<\/code> \u2014 Heap-Warteschlange \u00fcber Listen.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">bisect<\/code> \u2014 h\u00e4lt sortierte Reihenfolge in Listen.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Listen \u2014 <code class=\"\" data-line=\"\">list<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Geordnete, ver\u00e4nderbare Sammlung. Elemente k\u00f6nnen sich wiederholen, beliebige Typen erlaubt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wird verwendet, wenn eine flexible Sequenz ben\u00f6tigt wird: Hinzuf\u00fcgen, Entfernen, \u00c4ndern von Elementen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Erstellung: <code class=\"\" data-line=\"\">[]<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">lukas_list = &#091;&quot;Lukas&quot;, &quot;Berlin&quot;, 30, &quot;Ingenieur&quot;]\nprint(f&quot;Listen-Erstellung: {lukas_list}&quot;)\n# \u2192 Listen-Erstellung: &#091;&#039;Lukas&#039;, &#039;Berlin&#039;, 30, &#039;Ingenieur&#039;]\n\nprint(f&quot;Element bei Index 0: {lukas_list&#091;0]}&quot;)\n# \u2192 Element bei Index 0: Lukas\n\nlukas_list&#091;2] = 31\nprint(f&quot;Nach \u00c4nderung: {lukas_list}&quot;)\n# \u2192 Nach \u00c4nderung: &#091;&#039;Lukas&#039;, &#039;Berlin&#039;, 31, &#039;Ingenieur&#039;]\n\nlukas_list.append(&quot;verheiratet&quot;)\nprint(f&quot;Nach append: {lukas_list}&quot;)\n# \u2192 Nach append: &#091;&#039;Lukas&#039;, &#039;Berlin&#039;, 31, &#039;Ingenieur&#039;, &#039;verheiratet&#039;]\n\nlukas_list.insert(1, &quot;Deutschland&quot;)\nprint(f&quot;Nach insert: {lukas_list}&quot;)\n# \u2192 Nach insert: &#091;&#039;Lukas&#039;, &#039;Deutschland&#039;, &#039;Berlin&#039;, 31, &#039;Ingenieur&#039;, &#039;verheiratet&#039;]\n\nlukas_list.remove(&quot;Ingenieur&quot;)\nprint(f&quot;Nach remove (Wert): {lukas_list}&quot;)\n# \u2192 Nach remove (Wert): &#091;&#039;Lukas&#039;, &#039;Deutschland&#039;, &#039;Berlin&#039;, 31, &#039;verheiratet&#039;]\n\ndel lukas_list&#091;2]\nprint(f&quot;Nach L\u00f6schung (Index): {lukas_list}&quot;)\n# \u2192 Nach L\u00f6schung (Index): &#091;&#039;Lukas&#039;, &#039;Deutschland&#039;, 31, &#039;verheiratet&#039;]\n\nlukas_list.extend(&#091;&quot;Hobbys&quot;, &quot;Angeln&quot;])\nprint(f&quot;Nach extend: {lukas_list}&quot;)\n# \u2192 Nach extend: &#091;&#039;Lukas&#039;, &#039;Deutschland&#039;, 31, &#039;verheiratet&#039;, &#039;Hobbys&#039;, &#039;Angeln&#039;]\n\nlukas_list.pop()\nprint(f&quot;Nach pop: {lukas_list}&quot;)\n# \u2192 Nach pop: &#091;&#039;Lukas&#039;, &#039;Deutschland&#039;, 31, &#039;verheiratet&#039;, &#039;Hobbys&#039;]<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. W\u00f6rterb\u00fccher \u2014 <code class=\"\" data-line=\"\">dict<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sammlung von <strong>Schl\u00fcssel \u2192 Wert<\/strong>-Paaren. Schl\u00fcssel m\u00fcssen hashbar sein. Seit Python 3.7 bleibt die Einf\u00fcgereihenfolge erhalten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00fctzlich f\u00fcr strukturierte Daten: Profile, Konfigurationen, JSON.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Erstellung: <code class=\"\" data-line=\"\">{}<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">anna_dict = {&quot;name&quot;: &quot;Anna&quot;, &quot;alter&quot;: 25, &quot;stadt&quot;: &quot;M\u00fcnchen&quot;, &quot;beruf&quot;: &quot;K\u00fcnstlerin&quot;}\nprint(f&quot;Dict-Erstellung: {anna_dict}&quot;)\n# \u2192 Dict-Erstellung: {&#039;name&#039;: &#039;Anna&#039;, &#039;alter&#039;: 25, &#039;stadt&#039;: &#039;M\u00fcnchen&#039;, &#039;beruf&#039;: &#039;K\u00fcnstlerin&#039;}\n\nprint(f&quot;Wert f\u00fcr Schl\u00fcssel &#039;name&#039;: {anna_dict&#091;&#039;name&#039;]}&quot;)\n# \u2192 Wert f\u00fcr Schl\u00fcssel &#039;name&#039;: Anna\n\nanna_dict&#091;&quot;alter&quot;] = 26\nprint(f&quot;Nach Aktualisierung: {anna_dict}&quot;)\n# \u2192 Nach Aktualisierung: {&#039;name&#039;: &#039;Anna&#039;, &#039;alter&#039;: 26, &#039;stadt&#039;: &#039;M\u00fcnchen&#039;, &#039;beruf&#039;: &#039;K\u00fcnstlerin&#039;}\n\nanna_dict&#091;&quot;hobby&quot;] = &quot;Malerei&quot;\nprint(f&quot;Nach Hinzuf\u00fcgen: {anna_dict}&quot;)\n# \u2192 Nach Hinzuf\u00fcgen: {&#039;name&#039;: &#039;Anna&#039;, &#039;alter&#039;: 26, &#039;stadt&#039;: &#039;M\u00fcnchen&#039;, &#039;beruf&#039;: &#039;K\u00fcnstlerin&#039;, &#039;hobby&#039;: &#039;Malerei&#039;}\n\ndel anna_dict&#091;&quot;stadt&quot;]\nprint(f&quot;Nach L\u00f6schung: {anna_dict}&quot;)\n# \u2192 Nach L\u00f6schung: {&#039;name&#039;: &#039;Anna&#039;, &#039;alter&#039;: 26, &#039;beruf&#039;: &#039;K\u00fcnstlerin&#039;, &#039;hobby&#039;: &#039;Malerei&#039;}\n\nhobby = anna_dict.pop(&quot;hobby&quot;)\nprint(f&quot;Nach pop: {anna_dict}, Wert: {hobby}&quot;)\n# \u2192 Nach pop: {&#039;name&#039;: &#039;Anna&#039;, &#039;alter&#039;: 26, &#039;beruf&#039;: &#039;K\u00fcnstlerin&#039;}, Wert: Malerei\n\nprint(f&quot;Schl\u00fcssel &#039;name&#039; vorhanden: {&#039;name&#039; in anna_dict}&quot;)\n# \u2192 Schl\u00fcssel &#039;name&#039; vorhanden: True<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Tupel \u2014 <code class=\"\" data-line=\"\">tuple<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Geordnete, unver\u00e4nderbare Sammlung. Geeignet f\u00fcr feste Daten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wird verwendet, wenn Unver\u00e4nderlichkeit wichtig ist: Koordinaten, Parameter, R\u00fcckgabewerte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Erstellung: <code class=\"\" data-line=\"\">()<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">lukas_tuple = (&quot;Lukas&quot;, &quot;Berlin&quot;, 30, &quot;Ingenieur&quot;)\nprint(f&quot;Tupel-Erstellung: {lukas_tuple}&quot;)\n# \u2192 Tupel-Erstellung: (&#039;Lukas&#039;, &#039;Berlin&#039;, 30, &#039;Ingenieur&#039;)\n\nprint(f&quot;Element bei Index 2: {lukas_tuple&#091;2]}&quot;)\n# \u2192 Element bei Index 2: 30\n\n# lukas_tuple&#091;0] = &quot;Max&quot;  \u2192 TypeError\n# lukas_tuple.append(&quot;etwas&quot;) \u2192 AttributeError<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tupel verbrauchen weniger Speicher und sind schneller als Listen.<\/li>\n\n\n\n<li>Ideal, wenn Ver\u00e4nderbarkeit nicht ben\u00f6tigt wird.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. SimpleNamespace<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Einfache Klasse aus <code class=\"\" data-line=\"\">types<\/code> zur Erstellung von Objekten mit dynamischen Attributen. Zugriff per Punktnotation (<code class=\"\" data-line=\"\">obj.attr<\/code>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00fctzlich, wenn man <code class=\"\" data-line=\"\">obj.name<\/code>-Syntax ohne Klassendefinition m\u00f6chte.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from types import SimpleNamespace\n\nanna_ns = SimpleNamespace(name=&quot;Anna&quot;, alter=25, stadt=&quot;M\u00fcnchen&quot;)\nprint(f&quot;Objekt: {anna_ns}&quot;)\n# \u2192 Objekt: namespace(name=&#039;Anna&#039;, alter=25, stadt=&#039;M\u00fcnchen&#039;)\n\nprint(f&quot;Name: {anna_ns.name}&quot;)\n# \u2192 Name: Anna\n\nanna_ns.alter = 26\nprint(f&quot;Nach \u00c4nderung: {anna_ns}&quot;)\n# \u2192 Nach \u00c4nderung: namespace(name=&#039;Anna&#039;, alter=26, stadt=&#039;M\u00fcnchen&#039;)\n\nanna_ns.beruf = &quot;K\u00fcnstlerin&quot;\nprint(f&quot;Mit neuem Attribut: {anna_ns}&quot;)\n# \u2192 Mit neuem Attribut: namespace(name=&#039;Anna&#039;, alter=26, stadt=&#039;M\u00fcnchen&#039;, beruf=&#039;K\u00fcnstlerin&#039;)\n\ndel anna_ns.stadt\nprint(f&quot;Nach L\u00f6schung: {anna_ns}&quot;)\n# \u2192 Nach L\u00f6schung: namespace(name=&#039;Anna&#039;, alter=26, beruf=&#039;K\u00fcnstlerin&#039;)\n\nsetattr(anna_ns, &quot;hobby&quot;, &quot;Malerei&quot;)\nprint(f&quot;Via setattr: {anna_ns}&quot;)\n# \u2192 Via setattr: namespace(name=&#039;Anna&#039;, alter=26, beruf=&#039;K\u00fcnstlerin&#039;, hobby=&#039;Malerei&#039;)\n\ndelattr(anna_ns, &quot;hobby&quot;)\nprint(f&quot;Via delattr: {anna_ns}&quot;)\n# \u2192 Via delattr: namespace(name=&#039;Anna&#039;, alter=26, beruf=&#039;K\u00fcnstlerin&#039;)<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Alternative zu dict, wenn <code class=\"\" data-line=\"\">obj.name<\/code> gegen\u00fcber <code class=\"\" data-line=\"\">obj[&#039;name&#039;]<\/code> bevorzugt wird.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Mengen \u2014 <code class=\"\" data-line=\"\">set<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ungeordnete Sammlung eindeutiger Elemente. Unterst\u00fctzt Mengenoperationen: Vereinigung, Schnitt, Differenz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wird zur Duplikatentfernung und Mitgliedschaftspr\u00fcfung verwendet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Erstellung: <code class=\"\" data-line=\"\">{}<\/code> oder <code class=\"\" data-line=\"\">set()<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">zahlen = {1, 2, 3, 3, 2, 1}\nprint(f&quot;Menge: {zahlen}&quot;)\n# \u2192 Menge: {1, 2, 3}\n\nzahlen.add(4)\nprint(f&quot;Nach Hinzuf\u00fcgen: {zahlen}&quot;)\n# \u2192 Nach Hinzuf\u00fcgen: {1, 2, 3, 4}\n\nzahlen.remove(2)\nprint(f&quot;Nach Entfernen: {zahlen}&quot;)\n# \u2192 Nach Entfernen: {1, 3, 4}\n\nandere = {3, 4, 5}\nprint(f&quot;Vereinigung: {zahlen | andere}&quot;)\n# \u2192 Vereinigung: {1, 3, 4, 5}\n\nprint(f&quot;Schnitt: {zahlen &amp; andere}&quot;)\n# \u2192 Schnitt: {3, 4}\n\nprint(f&quot;Differenz: {zahlen - andere}&quot;)\n# \u2192 Differenz: {1}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. Unver\u00e4nderbare Mengen \u2014 <code class=\"\" data-line=\"\">frozenset<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Unver\u00e4nderbare Version von <code class=\"\" data-line=\"\">set<\/code>. Kann als Dictionary-Schl\u00fcssel oder Mengenelement verwendet werden.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">frozen = frozenset(&#091;1, 2, 3, 2])\nprint(f&quot;frozenset: {frozen}&quot;)\n# \u2192 frozenset: frozenset({1, 2, 3})\n\nandere = frozenset(&#091;3, 4])\nprint(f&quot;Schnitt: {frozen &amp; andere}&quot;)\n# \u2192 Schnitt: frozenset({3})\n\nprint(f&quot;Vereinigung: {frozen | andere}&quot;)\n# \u2192 Vereinigung: frozenset({1, 2, 3, 4})\n\n# frozen.add(5) \u2192 AttributeError<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. namedtuple \u2014 benannte Tupel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Unver\u00e4nderbare Struktur mit Zugriff per Feldname. Lesbarer als normale Tupel.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from collections import namedtuple\n\nPerson = namedtuple(&quot;Person&quot;, &#091;&quot;name&quot;, &quot;alter&quot;, &quot;stadt&quot;])\nanna = Person(&quot;Anna&quot;, 25, &quot;M\u00fcnchen&quot;)\n\nprint(f&quot;Objekt: {anna}&quot;)\n# \u2192 Objekt: Person(name=&#039;Anna&#039;, alter=25, stadt=&#039;M\u00fcnchen&#039;)\n\nprint(f&quot;Name: {anna.name}&quot;)\n# \u2192 Name: Anna\n\nprint(f&quot;Alter: {anna&#091;1]}&quot;)\n# \u2192 Alter: 25\n\n# anna.alter = 26 \u2192 AttributeError\n\nanna_neu = anna._replace(alter=26)\nprint(f&quot;Kopie mit \u00c4nderung: {anna_neu}&quot;)\n# \u2192 Kopie mit \u00c4nderung: Person(name=&#039;Anna&#039;, alter=26, stadt=&#039;M\u00fcnchen&#039;)<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ideal f\u00fcr Datens\u00e4tze: Punkte, Benutzer, Konfigurationen \u2014 wenn Unver\u00e4nderlichkeit und Lesbarkeit z\u00e4hlen.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8. deque \u2014 doppelseitige Warteschlange<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Optimiert f\u00fcr schnelle Operationen an beiden Enden. Effizienter als <code class=\"\" data-line=\"\">list<\/code> f\u00fcr <code class=\"\" data-line=\"\">appendleft<\/code>, <code class=\"\" data-line=\"\">popleft<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from collections import deque\n\nd = deque(&#091;1, 2, 3])\nprint(f&quot;Initiale deque: {d}&quot;)\n# \u2192 Initiale deque: deque(&#091;1, 2, 3])\n\nd.appendleft(0)\nprint(f&quot;Nach appendleft: {d}&quot;)\n# \u2192 Nach appendleft: deque(&#091;0, 1, 2, 3])\n\nd.append(4)\nprint(f&quot;Nach append: {d}&quot;)\n# \u2192 Nach append: deque(&#091;0, 1, 2, 3, 4])\n\nlinks = d.popleft()\nprint(f&quot;Nach popleft: {links}, verbleibend: {d}&quot;)\n# \u2192 Nach popleft: 0, verbleibend: deque(&#091;1, 2, 3, 4])\n\nrechts = d.pop()\nprint(f&quot;Nach pop: {rechts}, verbleibend: {d}&quot;)\n# \u2192 Nach pop: 4, verbleibend: deque(&#091;1, 2, 3])<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wird in Algorithmen verwendet: BFS, LRU-Caches, Puffer \u2014 wenn Endoperationen schnell sein m\u00fcssen.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">9. Counter \u2014 Elementz\u00e4hler<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Z\u00e4hlt die H\u00e4ufigkeit von Elementen in einem iterierbaren Objekt. N\u00fctzlich f\u00fcr Statistiken und Analysen.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from collections import Counter\n\ntext = &quot;abracadabra&quot;\nc = Counter(text)\nprint(f&quot;Buchstaben-Z\u00e4hlung: {c}&quot;)\n# \u2192 Buchstaben-Z\u00e4hlung: Counter({&#039;a&#039;: 5, &#039;b&#039;: 2, &#039;r&#039;: 2, &#039;c&#039;: 1, &#039;d&#039;: 1})\n\nprint(f&quot;H\u00e4ufigkeit von &#039;a&#039;: {c&#091;&#039;a&#039;]}&quot;)\n# \u2192 H\u00e4ufigkeit von &#039;a&#039;: 5\n\nprint(f&quot;Top 3: {c.most_common(3)}&quot;)\n# \u2192 Top 3: &#091;(&#039;a&#039;, 5), (&#039;b&#039;, 2), (&#039;r&#039;, 2)]\n\nc2 = Counter(&quot;bukva&quot;)\nc.update(c2)\nprint(f&quot;Nach update: {c}&quot;)\n# \u2192 Nach update: Counter({&#039;a&#039;: 6, &#039;b&#039;: 3, &#039;r&#039;: 2, &#039;c&#039;: 1, &#039;d&#039;: 1, &#039;u&#039;: 1, &#039;k&#039;: 1, &#039;v&#039;: 1})<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>N\u00fctzlich f\u00fcr Textanalyse, Logs, Abstimmungen \u2014 \u00fcberall, wo \u201eh\u00e4ufigste Elemente\u201c z\u00e4hlen.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">10. defaultdict \u2014 W\u00f6rterbuch mit Standardwerten<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Erzeugt automatisch Standardwerte f\u00fcr fehlende Schl\u00fcssel. Entfernt <code class=\"\" data-line=\"\">if key in dict<\/code>-Pr\u00fcfungen.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from collections import defaultdict\n\ndd_list = defaultdict(list)\ndd_list&#091;&quot;fruechte&quot;].append(&quot;Apfel&quot;)\ndd_list&#091;&quot;fruechte&quot;].append(&quot;Banane&quot;)\nprint(f&quot;Liste: {dict(dd_list)}&quot;)\n# \u2192 Liste: {&#039;fruechte&#039;: &#091;&#039;Apfel&#039;, &#039;Banane&#039;]}\n\ndd_int = defaultdict(int)\nfor char in &quot;abracadabra&quot;:\n    dd_int&#091;char] += 1\nprint(f&quot;Z\u00e4hlungen: {dict(dd_int)}&quot;)\n# \u2192 Z\u00e4hlungen: {&#039;a&#039;: 5, &#039;b&#039;: 2, &#039;r&#039;: 2, &#039;c&#039;: 1, &#039;d&#039;: 1}\n\ndd_set = defaultdict(set)\ndd_set&#091;&quot;staedte&quot;].add(&quot;Berlin&quot;)\ndd_set&#091;&quot;staedte&quot;].add(&quot;M\u00fcnchen&quot;)\nprint(f&quot;Menge: {dict(dd_set)}&quot;)\n# \u2192 Menge: {&#039;staedte&#039;: {&#039;Berlin&#039;, &#039;M\u00fcnchen&#039;}}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Entfernt Boilerplate-Code wie <code class=\"\" data-line=\"\">if key not in d: d[key] = []<\/code>.<\/li>\n\n\n\n<li>Macht Code sauberer und sicherer.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">11. dataclass \u2014 Datenklassen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dekorator, der automatisch <code class=\"\" data-line=\"\">__init__<\/code>, <code class=\"\" data-line=\"\">__repr__<\/code>, <code class=\"\" data-line=\"\">__eq__<\/code> usw. generiert.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from dataclasses import dataclass\n\n@dataclass\nclass Person:\n    name: str\n    alter: int\n    stadt: str = &quot;Nicht angegeben&quot;\n\nanna = Person(&quot;Anna&quot;, 25)\nprint(f&quot;Objekt: {anna}&quot;)\n# \u2192 Objekt: Person(name=&#039;Anna&#039;, alter=25, stadt=&#039;Nicht angegeben&#039;)\n\nprint(f&quot;Name: {anna.name}&quot;)\n# \u2192 Name: Anna\n\nanna.alter = 26\nprint(f&quot;Nach \u00c4nderung: {anna}&quot;)\n# \u2192 Nach \u00c4nderung: Person(name=&#039;Anna&#039;, alter=26, stadt=&#039;Nicht angegeben&#039;)\n\nbob = Person(&quot;Bob&quot;, 30)\nprint(f&quot;Anna == Bob: {anna == bob}&quot;)\n# \u2192 Anna == Bob: False\n\n@dataclass(frozen=True)\nclass UnveraenderbarePerson:\n    name: str\n    alter: int\n\nivan = UnveraenderbarePerson(&quot;Ivan&quot;, 40)\n# ivan.alter = 41 \u2192 FrozenInstanceError<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ersetzt manuelles Schreiben von <code class=\"\" data-line=\"\">__init__<\/code>, <code class=\"\" data-line=\"\">__repr__<\/code>, <code class=\"\" data-line=\"\">__eq__<\/code>.<\/li>\n\n\n\n<li>Ideal f\u00fcr DTOs, Konfigurationen, Modelle.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">12. UserList \u2014 benutzerdefinierte Listen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Erbt von <code class=\"\" data-line=\"\">collections.UserList<\/code>. Wird verwendet, um Listen mit benutzerdefiniertem Verhalten zu erstellen.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from collections import UserList\n\nclass ProtokollierteListe(UserList):\n    def append(self, item):\n        print(f&quot;&#091;LOG] Hinzuf\u00fcgen: {item}&quot;)\n        super().append(item)\n\n    def remove(self, item):\n        print(f&quot;&#091;LOG] Entfernen: {item}&quot;)\n        super().remove(item)\n\nlog_list = ProtokollierteListe(&#091;1, 2, 3])\nprint(f&quot;Initial: {log_list}&quot;)\n# \u2192 Initial: &#091;1, 2, 3]\n\nlog_list.append(4)\n# \u2192 &#091;LOG] Hinzuf\u00fcgen: 4\nprint(f&quot;Nach append: {log_list}&quot;)\n# \u2192 Nach append: &#091;1, 2, 3, 4]\n\nlog_list.remove(2)\n# \u2192 &#091;LOG] Entfernen: 2\nprint(f&quot;Nach remove: {log_list}&quot;)\n# \u2192 Nach remove: &#091;1, 3, 4]<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>N\u00fctzlich zum Hinzuf\u00fcgen von Logging, Validierung oder zum \u00c4ndern des Standardlistenverhaltens.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">13. UserDict \u2014 benutzerdefinierte W\u00f6rterb\u00fccher<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Erbt von <code class=\"\" data-line=\"\">collections.UserDict<\/code>. Wird verwendet, um W\u00f6rterb\u00fccher mit benutzerdefiniertem Verhalten zu erstellen.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from collections import UserDict\n\nclass KleinschreibDict(UserDict):\n    def __setitem__(self, key, value):\n        key = key.lower() if isinstance(key, str) else key\n        super().__setitem__(key, value)\n\n    def __getitem__(self, key):\n        key = key.lower() if isinstance(key, str) else key\n        return super().__getitem__(key)\n\nld = KleinschreibDict()\nld&#091;&quot;Name&quot;] = &quot;Anna&quot;\nprint(f&quot;Wert f\u00fcr &#039;Name&#039;: {ld&#091;&#039;Name&#039;]}&quot;)\n# \u2192 Wert f\u00fcr &#039;Name&#039;: Anna\nprint(f&quot;Wert f\u00fcr &#039;name&#039;: {ld&#091;&#039;name&#039;]}&quot;)\n# \u2192 Wert f\u00fcr &#039;name&#039;: Anna\nprint(f&quot;Schl\u00fcssel: {list(ld.keys())}&quot;)\n# \u2192 Schl\u00fcssel: &#091;&#039;name&#039;]<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wird zur Schl\u00fcsselnormalisierung, Validierung, Protokollierung, Caching usw. verwendet.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcc8 Speicher- und Leistungsvergleich<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Wahl der Sammlung beeinflusst <strong>Leistung<\/strong> und <strong>Speicherverbrauch<\/strong>. Hier praktische Benchmarks.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1. Speicher: <code class=\"\" data-line=\"\">list<\/code> vs <code class=\"\" data-line=\"\">tuple<\/code> vs <code class=\"\" data-line=\"\">array.array<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">import sys\nfrom array import array\n\nn = 1_000_000\ndata = list(range(n))\ndata_t = tuple(range(n))\ndata_a = array(&#039;i&#039;, range(n))\n\nprint(f&quot;list:  {sys.getsizeof(data) \/ 1024 \/ 1024:.2f} MB&quot;)\n# \u2192 list:  8.00 MB\n\nprint(f&quot;tuple: {sys.getsizeof(data_t) \/ 1024 \/ 1024:.2f} MB&quot;)\n# \u2192 tuple: 8.00 MB\n\nprint(f&quot;array: {sys.getsizeof(data_a) \/ 1024 \/ 1024:.2f} MB&quot;)\n# \u2192 array: 3.81 MB<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">array.array<\/code> verbraucht ~2x weniger Speicher f\u00fcr Zahlen.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">list<\/code> und <code class=\"\" data-line=\"\">tuple<\/code> verbrauchen \u00e4hnlichen Speicher, aber <code class=\"\" data-line=\"\">tuple<\/code> ist etwas schneller bei Iteration.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2. Zugriffsgeschwindigkeit: <code class=\"\" data-line=\"\">list<\/code> vs <code class=\"\" data-line=\"\">tuple<\/code> vs <code class=\"\" data-line=\"\">array.array<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">import time\n\ndef time_access(collection, name):\n    start = time.perf_counter()\n    total = 0\n    for i in range(len(collection)):\n        total += collection&#091;i]\n    end = time.perf_counter()\n    print(f&quot;{name}: {end - start:.4f} Sekunden&quot;)\n\nn = 10_000_000\nlst = list(range(n))\ntpl = tuple(range(n))\narr = array(&#039;i&#039;, range(n))\n\ntime_access(lst, &quot;list&quot;)   # \u2192 list: 1.2000 Sekunden\ntime_access(tpl, &quot;tuple&quot;)  # \u2192 tuple: 1.0000 Sekunden\ntime_access(arr, &quot;array&quot;)  # \u2192 array: 0.8000 Sekunden<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">array.array<\/code> ist am schnellsten f\u00fcr numerische Daten.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">tuple<\/code> ist 10\u201320% schneller als <code class=\"\" data-line=\"\">list<\/code>.<\/li>\n\n\n\n<li>Unterschied bemerkbar bei gro\u00dfen Datenmengen.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3. Speicher: <code class=\"\" data-line=\"\">dict<\/code> vs <code class=\"\" data-line=\"\">SimpleNamespace<\/code> vs <code class=\"\" data-line=\"\">dataclass<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">d = {&quot;name&quot;: &quot;A&quot;, &quot;alter&quot;: 25, &quot;stadt&quot;: &quot;X&quot;, &quot;hobby&quot;: &quot;Y&quot;, &quot;job&quot;: &quot;Z&quot;}\nns = SimpleNamespace(name=&quot;A&quot;, alter=25, stadt=&quot;X&quot;, hobby=&quot;Y&quot;, job=&quot;Z&quot;)\ndc = PersonDC(&quot;A&quot;, 25, &quot;X&quot;, &quot;Y&quot;, &quot;Z&quot;)\n\nprint(f&quot;dict:      {sys.getsizeof(d)} Bytes&quot;)          # \u2192 232\nprint(f&quot;SimpleNamespace: {sys.getsizeof(ns)} Bytes&quot;)   # \u2192 64\nprint(f&quot;dataclass: {sys.getsizeof(dc)} Bytes&quot;)         # \u2192 64\nprint(f&quot;ns.__dict__: {sys.getsizeof(ns.__dict__)} Bytes&quot;)  # \u2192 232<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">SimpleNamespace<\/code> und <code class=\"\" data-line=\"\">dataclass<\/code> verbrauchen so viel Speicher wie <code class=\"\" data-line=\"\">dict<\/code> wegen <code class=\"\" data-line=\"\">__dict__<\/code>.<\/li>\n\n\n\n<li>Verwenden Sie <code class=\"\" data-line=\"\">__slots__<\/code> zur Speicherersparnis.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4. Speicheroptimierung: <code class=\"\" data-line=\"\">dataclass<\/code> mit <code class=\"\" data-line=\"\">__slots__<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">@dataclass\nclass PersonSlots:\n    __slots__ = (&quot;name&quot;, &quot;alter&quot;, &quot;stadt&quot;, &quot;hobby&quot;, &quot;job&quot;)\n    name: str\n    alter: int\n    stadt: str\n    hobby: str\n    job: str\n\ndc_slots = PersonSlots(&quot;A&quot;, 25, &quot;X&quot;, &quot;Y&quot;, &quot;Z&quot;)\nprint(f&quot;dataclass + slots: {sys.getsizeof(dc_slots)} Bytes&quot;)\n# \u2192 80 Bytes\n\n# dc_slots.neu = &quot;Wert&quot; \u2192 AttributeError<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">__slots__<\/code> spart Speicher und beschleunigt Attributzugriff.<\/li>\n\n\n\n<li>Nachteil: keine dynamischen Attribute.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">5. Suchgeschwindigkeit: <code class=\"\" data-line=\"\">list<\/code> vs <code class=\"\" data-line=\"\">set<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">n = 1_000_000\nlst = list(range(n))\nst = set(range(n))\n\ndef time_in(collection, target, name):\n    start = time.perf_counter()\n    for _ in range(1000):\n        _ = target in collection\n    end = time.perf_counter()\n    print(f&quot;{name} (Suche {target}): {end - start:.4f} Sekunden&quot;)\n\ntime_in(lst, 999_999, &quot;list&quot;)   # \u2192 10.0000 Sekunden\ntime_in(st, 999_999, &quot;set&quot;)     # \u2192 0.0005 Sekunden<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">set<\/code> ist tausendmal schneller als <code class=\"\" data-line=\"\">list<\/code> f\u00fcr Mitgliedschaftspr\u00fcfungen.<\/li>\n\n\n\n<li>Immer <code class=\"\" data-line=\"\">set<\/code> verwenden, wenn h\u00e4ufig <code class=\"\" data-line=\"\">x in collection<\/code> gepr\u00fcft wird.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">6. Speicher: <code class=\"\" data-line=\"\">set<\/code> vs <code class=\"\" data-line=\"\">frozenset<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">s = set(range(1000))\nfs = frozenset(range(1000))\n\nprint(f&quot;set:       {sys.getsizeof(s)} Bytes&quot;)     # \u2192 32792\nprint(f&quot;frozenset: {sys.getsizeof(fs)} Bytes&quot;)   # \u2192 32792<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">frozenset<\/code> und <code class=\"\" data-line=\"\">set<\/code> verbrauchen identischen Speicher.<\/li>\n\n\n\n<li>Unterschied nur in der Ver\u00e4nderbarkeit.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">7. Hinzuf\u00fcgungsgeschwindigkeit: <code class=\"\" data-line=\"\">list.append<\/code> vs <code class=\"\" data-line=\"\">deque.append<\/code> vs <code class=\"\" data-line=\"\">deque.appendleft<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from collections import deque\nimport time\n\ndef time_append(collection, n, method=&#039;append&#039;):\n    start = time.perf_counter()\n    for i in range(n):\n        if method == &#039;appendleft&#039; and hasattr(collection, &#039;appendleft&#039;):\n            collection.appendleft(i)\n        else:\n            collection.append(i)\n    end = time.perf_counter()\n    return end - start\n\nn = 100_000\n\nlst = &#091;]\ndq = deque()\n\ntime_list_append = time_append(lst, n)              # \u2192 0.0100 Sekunden\ntime_deque_append = time_append(dq, n)              # \u2192 0.0100 Sekunden\ntime_deque_appendleft = time_append(deque(), n, &#039;appendleft&#039;)  # \u2192 0.0100 Sekunden\n\n# list.insert(0):\nlst = &#091;]\nstart = time.perf_counter()\nfor i in range(n):\n    lst.insert(0, i)\nend = time.perf_counter()\nprint(f&quot;list.insert(0):   {end - start:.4f} Sekunden&quot;)   # \u2192 5.0000 Sekunden<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">deque.appendleft<\/code> ist O(1), im Gegensatz zu <code class=\"\" data-line=\"\">list.insert(0)<\/code> (O(n)).<\/li>\n\n\n\n<li>Verwenden Sie <code class=\"\" data-line=\"\">deque<\/code> f\u00fcr h\u00e4ufige Operationen an beiden Enden.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde0 Leistungsempfehlungen<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Situation<\/th><th>Verwenden<\/th><th>Grund<\/th><\/tr><\/thead><tbody><tr><td>Zahlen speichern, Speicher kritisch<\/td><td><code class=\"\" data-line=\"\">array.array<\/code><\/td><td>2x weniger Speicher, schneller Zugriff<\/td><\/tr><tr><td>Unver\u00e4nderliche Daten<\/td><td><code class=\"\" data-line=\"\">tuple<\/code><\/td><td>Schneller als <code class=\"\" data-line=\"\">list<\/code>, sicherer<\/td><\/tr><tr><td>H\u00e4ufige <code class=\"\" data-line=\"\">x in collection<\/code>-Pr\u00fcfungen<\/td><td><code class=\"\" data-line=\"\">set<\/code> \/ <code class=\"\" data-line=\"\">frozenset<\/code><\/td><td>O(1) vs O(n) von <code class=\"\" data-line=\"\">list<\/code><\/td><\/tr><tr><td>Operationen an beiden Enden<\/td><td><code class=\"\" data-line=\"\">deque<\/code><\/td><td><code class=\"\" data-line=\"\">appendleft<\/code>\/<code class=\"\" data-line=\"\">popleft<\/code> in O(1)<\/td><\/tr><tr><td>Strukturierte Daten, Speicher kritisch<\/td><td><code class=\"\" data-line=\"\">dataclass<\/code> + <code class=\"\" data-line=\"\">__slots__<\/code><\/td><td>Kein <code class=\"\" data-line=\"\">__dict__<\/code>, weniger Speicher<\/td><\/tr><tr><td>H\u00e4ufigkeiten z\u00e4hlen<\/td><td><code class=\"\" data-line=\"\">Counter<\/code><\/td><td>F\u00fcr diese Aufgabe optimiert<\/td><\/tr><tr><td>Benutzerdefiniertes Verhalten<\/td><td><code class=\"\" data-line=\"\">UserList<\/code> \/ <code class=\"\" data-line=\"\">UserDict<\/code><\/td><td>Sichere Erweiterung integrierter Sammlungen<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcca Sammlungsvergleich<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Typ<\/th><th>Geordnet<\/th><th>Ver\u00e4nderbar<\/th><th>Eindeutige Elemente<\/th><th>Indexzugriff<\/th><th>Duplikate<\/th><\/tr><\/thead><tbody><tr><td><code class=\"\" data-line=\"\">list<\/code><\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">tuple<\/code><\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">dict<\/code><\/td><td>\u2705 Ja*<\/td><td>\u2705 Ja<\/td><td>Nur Schl\u00fcssel<\/td><td>\u274c Nein<\/td><td>Werte: \u2705<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">set<\/code><\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><td>\u274c Nein<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">frozenset<\/code><\/td><td>\u274c Nein<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><td>\u274c Nein<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">SimpleNamespace<\/code><\/td><td>\u2705 Ja (Attrs)<\/td><td>\u2705 Ja<\/td><td>\u274c Nein (Attrs k\u00f6nnen semantisch doppelt sein)<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">namedtuple<\/code><\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">deque<\/code><\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">Counter<\/code><\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><td>\u274c Nein (aber hat Schl\u00fcssel)<\/td><td>\u2705 Ja<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">defaultdict<\/code><\/td><td>\u2705 Ja*<\/td><td>\u2705 Ja<\/td><td>Nur Schl\u00fcssel<\/td><td>\u274c Nein<\/td><td>Werte: \u2705<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">dataclass<\/code><\/td><td>\u2705 Ja (Felder)<\/td><td>\u2705 Ja (wenn nicht frozen)<\/td><td>\u274c Nein<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">UserList<\/code><\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">UserDict<\/code><\/td><td>\u2705 Ja*<\/td><td>\u2705 Ja<\/td><td>Nur Schl\u00fcssel<\/td><td>\u274c Nein<\/td><td>Werte: \u2705<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">str<\/code><\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">bytes<\/code><\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">bytearray<\/code><\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">range<\/code><\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">array.array<\/code><\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">ChainMap<\/code><\/td><td>\u2705 Ja*<\/td><td>\u2705 Ja<\/td><td>Nur Schl\u00fcssel<\/td><td>\u274c Nein<\/td><td>Werte: \u2705<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">Enum<\/code><\/td><td>\u2705 Ja<\/td><td>\u274c Nein<\/td><td>\u2705 Ja (Mitglieder)<\/td><td>\u274c Nein<\/td><td>\u274c Nein<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<ul class=\"wp-block-list\">\n<li>\u2014 seit Python 3.7 behalten <code class=\"\" data-line=\"\">dict<\/code>, <code class=\"\" data-line=\"\">defaultdict<\/code>, <code class=\"\" data-line=\"\">UserDict<\/code>, <code class=\"\" data-line=\"\">ChainMap<\/code> Einf\u00fcgereihenfolge bei.<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udca1 Wann was verwenden?<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Aufgabe<\/th><th>Sammlung<\/th><\/tr><\/thead><tbody><tr><td>Ver\u00e4nderbare Sequenz<\/td><td><code class=\"\" data-line=\"\">list<\/code> \/ <code class=\"\" data-line=\"\">deque<\/code> \/ <code class=\"\" data-line=\"\">UserList<\/code> \/ <code class=\"\" data-line=\"\">bytearray<\/code><\/td><\/tr><tr><td>Unver\u00e4nderliche Daten<\/td><td><code class=\"\" data-line=\"\">tuple<\/code> \/ <code class=\"\" data-line=\"\">namedtuple<\/code> \/ <code class=\"\" data-line=\"\">frozenset<\/code> \/ <code class=\"\" data-line=\"\">str<\/code> \/ <code class=\"\" data-line=\"\">bytes<\/code><\/td><\/tr><tr><td>Schnelle Suche, Duplikate entfernen<\/td><td><code class=\"\" data-line=\"\">set<\/code> \/ <code class=\"\" data-line=\"\">frozenset<\/code><\/td><\/tr><tr><td>Strukturierte Daten<\/td><td><code class=\"\" data-line=\"\">dict<\/code> \/ <code class=\"\" data-line=\"\">dataclass<\/code> \/ <code class=\"\" data-line=\"\">SimpleNamespace<\/code> \/ <code class=\"\" data-line=\"\">UserDict<\/code> \/ <code class=\"\" data-line=\"\">TypedDict<\/code><\/td><\/tr><tr><td>Als Dictionary-Schl\u00fcssel verwendbar<\/td><td><code class=\"\" data-line=\"\">frozenset<\/code><\/td><\/tr><tr><td>Tempor\u00e4re Objekte mit Punktzugriff<\/td><td><code class=\"\" data-line=\"\">SimpleNamespace<\/code> \/ <code class=\"\" data-line=\"\">dataclass<\/code><\/td><\/tr><tr><td>H\u00e4ufigkeiten z\u00e4hlen<\/td><td><code class=\"\" data-line=\"\">Counter<\/code><\/td><\/tr><tr><td>Standardwerte f\u00fcr Schl\u00fcssel<\/td><td><code class=\"\" data-line=\"\">defaultdict<\/code><\/td><\/tr><tr><td>Effiziente Endoperationen<\/td><td><code class=\"\" data-line=\"\">deque<\/code><\/td><\/tr><tr><td>Benutzerdefiniertes Listenverhalten<\/td><td><code class=\"\" data-line=\"\">UserList<\/code><\/td><\/tr><tr><td>Benutzerdefiniertes Dict-Verhalten<\/td><td><code class=\"\" data-line=\"\">UserDict<\/code><\/td><\/tr><tr><td>Bin\u00e4rdaten<\/td><td><code class=\"\" data-line=\"\">bytes<\/code> \/ <code class=\"\" data-line=\"\">bytearray<\/code> \/ <code class=\"\" data-line=\"\">array.array<\/code><\/td><\/tr><tr><td>Konfigurationen mit Hierarchie<\/td><td><code class=\"\" data-line=\"\">ChainMap<\/code><\/td><\/tr><tr><td>Benannte Konstanten<\/td><td><code class=\"\" data-line=\"\">Enum<\/code><\/td><\/tr><tr><td>Faule Sequenzen<\/td><td><code class=\"\" data-line=\"\">range<\/code> \/ Generatoren<\/td><\/tr><\/tbody><\/table><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Eine Sammlung ist eine Struktur, die mehrere Objekte in einem einzigen Container zusammenfasst, wodurch deren Verarbeitung und Datenverwaltung erleichtert wird. Sie macht den Code \u00fcbersichtlicher und vereinfacht die Informationsverarbeitung.<\/p>\n","protected":false},"author":1,"featured_media":3250,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"left","neve_meta_author_avatar":"on","neve_post_elements_order":"[\"content\",\"tags\",\"comments\"]","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[],"tags":[],"class_list":["post-3176","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts\/3176","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/comments?post=3176"}],"version-history":[{"count":0,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts\/3176\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/media\/3250"}],"wp:attachment":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/media?parent=3176"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/categories?post=3176"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/tags?post=3176"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}