Lernpfad
Wenn Leute, die mit Daten arbeiten, heute über Datenspeicherung reden, meinen sie meistens, wo die Daten gespeichert sind, egal ob in lokalen Dateien, SQL- oder nosql-Datenbanken oder in der Cloud. Ein weiterer wichtiger Punkt bei der Datenspeicherung ist aber auch, wie die Daten gespeichert werden.
Wie Daten gespeichert werden, passiert oft auf einer niedrigeren Ebene, also im Kern der Programmiersprachen. Es geht eher darum, wie die Tools, die wir benutzen, gestaltet sind, als darum, wie man sie benutzt. Aber zu wissen, wie Daten gespeichert werden, ist echt wichtig, um die Mechanismen zu verstehen, die die Arbeit möglich machen. Außerdem kann dieses Wissen uns dabei helfen, bessere Entscheidungen zu treffen, um die Rechenleistung zu verbessern.
Wenn du dich wirklich für Hashmaps sowie für verknüpfte Listen, Stapel, Warteschlangen und Graphen interessierst, melde dich bei DataCamp an, damit du unseren Kurs Datenstrukturen und Algorithmen in Python belegen kannst.
Was ist eine Hashmap?
Um eine Hashmap zu definieren, müssen wir erst mal wissen, was Hashing ist. Hashing ist der Vorgang, bei dem ein bestimmter Schlüssel oder eine Zeichenfolge in einen anderen Wert umgewandelt wird. Das Ergebnis ist normalerweise ein kürzerer Wert mit fester Länge, der rechnerisch einfacher zu verarbeiten ist als der ursprüngliche Schlüssel.
Hashmaps, auch als Hash-Tabellen bekannt, sind eine der häufigsten Arten, Hashing zu machen. Hashmaps speichern Schlüssel-Wert-Paare (z. B. Mitarbeiter-ID und Name) in einer Liste, auf die man über ihren Index zugreifen kann. Man könnte sagen, dass eine Hashmap in „ “ eine Datenstruktur ist, die Hash-Techniken nutzt, um Daten auf assoziative Weise zu speichern. Das sind optimierte Datenstrukturen, die schnellere Datenoperationen wie Einfügen, Löschen und Suchen ermöglichen.
Die Idee hinter Hashmaps ist, die Einträge (Schlüssel/Wert-Paare) auf eine Reihe von Buckets zu verteilen. Mit einem Schlüssel berechnet eine Hash-Funktion einen eindeutigen Index, der angibt, wo der Eintrag zu finden ist. Durch die Verwendung eines Index anstelle des ursprünglichen Schlüssels eignen sich Hashmaps besonders gut für verschiedene Datenoperationen, wie zum Beispiel das Einfügen, Entfernen und Suchen von Daten.
Wie ein Hashmap funktioniert. Bild vom Autor
Um den Hashwert oder einfach Hash zu berechnen, generiert eine Hashfunktion neue Werte nach einem mathematischen Hash-Algorithmus. Da Schlüssel-Wert-Paare theoretisch unbegrenzt sind, ordnet die Hash-Funktion die Schlüssel anhand einer bestimmten Tabelle zu.
Es gibt mehrere Hash-Funktionen, jede mit ihren Vor- und Nachteilen. Das Hauptziel einer Hash-Funktion ist, für dieselbe Eingabe immer denselben Wert zurückzugeben.
Die häufigsten sind die folgenden:
- Division-Methode: Das ist die einfachste und schnellste Methode, um Hash-Werte zu berechnen. Dazu wird der Schlüssel durch die Größe der Tabelle geteilt und der Rest als Hash verwendet.
- Mittlere Quadratmethode: Es sucht den Quadratwert des angegebenen Schlüssels, nimmt dann die mittleren Ziffern und benutzt diese als Index für das Element.
- Multiplikationsmethode: Es legt den Hash-Index aus dem Bruchteil der Multiplikation des Schlüssels mit einer großen reellen Zahl fest.
- Faltmethode: Der Schlüssel wird erst mal in gleich große Teile aufgeteilt, die Teile werden addiert und das Ergebnis wird durch die Größe der Tabelle geteilt. Der Hash ist die Erinnerung.
Hashmap in Python
Python macht Hashmaps über den eingebauten Datentyp „Dictionary“. {key:value}
Genau wie Hashmaps speichern Wörterbücher Daten in Schlüssel-Wert-Paaren. Sobald du das Wörterbuch erstellt hast (siehe nächster Abschnitt), nutzt Python eine praktische Hash-Funktion, um den Hashwert jedes Schlüssels zu berechnen.
Python-Wörterbücher haben die folgenden Funktionen:
- Wörterbücher können geändert werden: Das heißt, wir können Sachen ändern, hinzufügen oder löschen, nachdem das Wörterbuch erstellt wurde.
- Die Elemente sind so angeordnet: In Python 3.6 und früheren Versionen waren Wörterbücher ungeordnet, was bedeutet, dass die Elemente keine bestimmte Reihenfolge hatten. Nach der Veröffentlichung von Python 3.7 sind Wörterbücher jetzt aber ordnungserhaltend. Wenn du jetzt ein Python-Wörterbuch erstellst, folgen die Schlüssel der Reihenfolge, die im Quellcode angegeben ist. Wenn du mehr über die Gründe für diese Änderung wissen willst, schau dir diese Notiz von Raymond Hettinger an, einem der Hauptentwickler von Python.
- Schlüssel sind unveränderlich: Das heißt, dass Schlüssel immer Datentypen sind, die man nicht ändern kann. Anders gesagt, Wörterbücher lassen nur Datentypen zu, die hashbar sind, wie Zeichenfolgen, Zahlen und Tupel. Im Gegenteil, Schlüssel können niemals ein veränderbarer Datentyp sein, wie zum Beispiel eine Liste.
- Schlüssel sind einzigartig: Schlüssel sind innerhalb eines Wörterbuchs einzigartig und können nicht doppelt vorkommen. Wenn es mehr als einmal benutzt wird, werden die vorherigen Werte durch die späteren Einträge überschrieben.
Also, wenn du dich schon mal gefragt hast, was der Unterschied zwischen Hashmaps und Wörterbüchern ist, ist die Antwort ganz einfach. Ein Wörterbuch ist einfach die native Implementierung von Hashmaps in Python. Während eine Hashmap eine Datenstruktur ist, die mit verschiedenen Hash-Techniken erstellt werden kann, ist ein Wörterbuch eine spezielle, Python-basierte Hashmap, deren Design und Verhalten in der Python-Klasse „dict“ festgelegt sind.
Viele moderne Programmiersprachen wie Python, Java und C++ können mit Hashmaps umgehen. In Python werden Hashmaps über Wörterbücher gemacht, eine weit verbreitete Datenstruktur, die du wahrscheinlich kennst. In den nächsten Abschnitten schauen wir uns die Grundlagen von Wörterbüchern an, wie sie funktionieren und wie man sie mit verschiedenen Python-Paketen umsetzt.
Wie man Python-Wörterbücher benutzt
Schauen wir uns mal ein paar der häufigsten Wörterbuchoperationen an. Wenn du mehr über die Verwendung von Wörterbüchern erfahren möchtest, schau dir unser Python-Wörterbuch-Tutorial an.
Ein Wörterbuch erstellen
Das Erstellen von Wörterbüchern in Python ist ziemlich einfach. Du musst einfach nur geschweifte Klammern nehmen und die Schlüssel-Wert-Paare durch Kommas getrennt einfügen. Du kannst auch die eingebaute Funktion dict()
benutzen. Lass uns ein Wörterbuch erstellen, das Hauptstädte den Ländern zuordnet:
# Create dictionary
dictionary_capitals = {'Madrid': 'Spain', 'Lisboa': 'Portugal', 'London': 'United Kingdom'}
# Print the content of the dictionary
print(dictionary_capitals)
# Expected output:
# {'Madrid': 'Spain', 'Lisboa': 'Portugal', 'London': 'United Kingdom'}
Man muss bedenken, dass ein Schlüssel in einem Wörterbuch einzigartig sein muss; Duplikate sind nicht erlaubt. Bei doppelten Schlüsseln gibt Python aber keinen Fehler aus, sondern nimmt einfach das letzte Schlüsselpaar als gültig und ignoriert das erste Schlüssel-Wert-Paar. Schau es dir selbst an:
dictionary_capitals = {'Madrid': 'China', 'Lisboa': 'Portugal',
'London': 'United Kingdom','Madrid':'Spain'}
print(dictionary_capitals)
# Expected output:
# {'Madrid': 'Spain', 'Lisboa': 'Portugal', 'London': 'United Kingdom'}
Im Wörterbuch nachschlagen
Um Infos in unserem Wörterbuch zu suchen, müssen wir den Schlüssel in Klammern angeben, und Python gibt dann den dazugehörigen Wert zurück, wie folgt:
# Search for data
print(dictionary_capitals['Madrid'])
# Expected output: Spain
Wenn du versuchst, auf einen Schlüssel zuzugreifen, der nicht im Wörterbuch steht, gibt Python eine Fehlermeldung aus. Um das zu vermeiden, kannst du stattdessen mit der Methode .get()
auf die Schlüssel zugreifen. Wenn der Schlüssel nicht da ist, wird einfach ein None-Wert zurückgegeben:
print(dictionary_capitals.get('Prague'))
# Expected output: None
Werte in einem Wörterbuch hinzufügen und löschen
Lass uns ein neues Paar aus Hauptstadt und Land hinzufügen:
# Create a new key-value pair
dictionary_capitals['Berlin'] = 'Italy'
print(dictionary_capitals)
# Expected output:
# {'Madrid': 'Spain', 'Lisboa': 'Portugal', 'London': 'United Kingdom', 'Berlin': 'Italy'}
Die gleiche Syntax kann verwendet werden, um den mit einem Schlüssel verbundenen Wert zu aktualisieren. Lass uns den Wert für Berlin festlegen:
# Update the value of a key
dictionary_capitals['Berlin'] = 'Germany'
print(dictionary_capitals)
# Expected output:
# {'Madrid': 'Spain', 'Lisboa': 'Portugal', 'London': 'United Kingdom', 'Berlin': 'Germany'}
Jetzt löschen wir eins der Paare in unserem Wörterbuch.
# Delete key-value pair
del dictionary_capitals['Lisboa']
print(dictionary_capitals)
# Expected output:
# {'Madrid': 'Spain', 'London': 'United Kingdom', 'Berlin': 'Germany'}
Oder wenn du alle Schlüssel-Wert-Paare im Wörterbuch löschen willst, kannst du die Methode .clear()
verwenden:
dictionary_capitals.clear()
print(dictionary_capitals)
# Expected output: {}
Durchsuchen von Wörterbüchern
Wenn du alle Schlüssel-Wert-Paare abrufen willst, nimm die Methode .items()
, und Python gibt dir eine durchlaufbare Liste von Tupeln zurück:
dictionary_capitals = {'Madrid': 'Spain', 'Lisboa': 'Portugal',
'London': 'United Kingdom', 'Berlin': 'Germany'}
print(dictionary_capitals.items())
# Expected output:
# dict_items([('Madrid', 'Spain'), ('Lisboa', 'Portugal'),
# ('London', 'United Kingdom'), ('Berlin', 'Germany')])
# Iterate over key-value pairs
for key, value in dictionary_capitals.items():
print('the capital of {} is {}'.format(value, key))
# Expected output:
# the capital of Spain is Madrid
# the capital of Portugal is Lisboa
# the capital of United Kingdom is London
# the capital of Germany is Berlin
Wenn du eine iterierbare Liste mit den Schlüsseln und Werten abrufen willst, kannst du die Methoden .keys()
und .values()
verwenden:
print(dictionary_capitals.keys())
# Expected output:
# dict_keys(['Madrid', 'Lisboa', 'London', 'Berlin'])
for key in dictionary_capitals.keys():
print(key.upper())
# Expected output:
# MADRID
# LISBOA
# LONDON
# BERLIN
print(dictionary_capitals.values())
# Expected output:
# dict_values(['Spain', 'Portugal', 'United Kingdom', 'Germany'])
for value in dictionary_capitals.values():
print(value.upper())
# Expected output:
# SPAIN
# PORTUGAL
# UNITED KINGDOM
# GERMANY
Praktische Anwendungen von Hashmaps
Hashmaps sind echt mächtige Datenstrukturen, die man fast überall in der digitalen Welt findet. Hier findest du eine Liste mit echten Anwendungen von Hashmaps:
- Datenbank-Indizierung: Hashmaps werden oft benutzt, um riesige Datenmengen zu indexieren und zu durchsuchen. Gängige Webbrowser nutzen Hashmaps, um indizierte Webseiten zu speichern.
- Cache-Verwaltung: Moderne Betriebssysteme nutzen Hash-Maps, um den Cache-Speicher zu organisieren, damit man schnell auf oft genutzte Infos zugreifen kann.
- Kryptografie: Hashmaps sind echt wichtig in der Kryptografie. Kryptografische Algorithmen nutzen Hash-Maps, um Datenintegrität, Datenvalidierung und sichere Transaktionen über Netzwerke hinweg zu ermöglichen.
- Blockchain: Hashmaps sind das Herzstück der Blockchain. Jedes Mal, wenn im Netzwerk eine Transaktion stattfindet, werden die Daten dieser Transaktion in die Hash-Funktion eingegeben, die dann eine eindeutige Ausgabe erzeugt. Jeder Block in der Blockchain hat den Hash des vorherigen Blocks und bildet so eine Kette von Blöcken.
Hashmap – Best Practices und häufige Fehler
Hashmaps sind echt vielseitige und effiziente Datenstrukturen. Allerdings bringen sie auch Probleme und Einschränkungen mit sich. Um die üblichen Probleme mit Hashmaps zu lösen, solltest du ein paar Dinge beachten und bewährte Vorgehensweisen anwenden.
Schlüssel müssen unveränderlich sein.
Das macht Sinn: Wenn sich der Inhalt des Schlüssels ändert, gibt die Hash-Funktion einen anderen Hash zurück, sodass Python den mit dem Schlüssel verbundenen Wert nicht finden kann.
Umgang mit Hashmap-Kollisionen
Hashing klappt nur, wenn jedes Element einem eindeutigen Speicherplatz in der Hash-Tabelle zugeordnet ist. Aber manchmal können Hash-Funktionen für unterschiedliche Eingaben dieselbe Ausgabe liefern. Wenn du zum Beispiel eine Divisions-Hash-Funktion benutzt, können verschiedene ganze Zahlen dieselbe Hash-Funktion haben (sie können bei der Modulo-Division denselben Rest ergeben), was zu einem Problem namens Kollision führt. Kollisionen müssen gelöst werden, und dafür gibt's verschiedene Techniken. Zum Glück kümmert sich Python bei Wörterbüchern im Hintergrund um mögliche Kollisionen.
Den Auslastungsfaktor verstehen
Der Auslastungsfaktor ist das Verhältnis zwischen der Anzahl der Elemente in den Tabellen und der Gesamtzahl der Buckets. Das ist eine Methode, um zu sehen, wie gleichmäßig die Daten verteilt sind. Als Faustregel gilt: Je gleichmäßiger die Daten verteilt sind, desto geringer ist die Wahrscheinlichkeit von Kollisionen. Auch bei Dictionaries passt Python die Größe der Tabelle automatisch an, wenn neue Schlüssel-Wert-Paare eingefügt oder gelöscht werden.
Achte auf die Leistung
Eine gute Hash-Funktion sollte die Anzahl der Kollisionen minimieren, einfach zu berechnen sein und die Elemente in der Hash-Tabelle gleichmäßig verteilen. Das könnte man machen, indem man die Größe der Tabelle oder die Komplexität der Hash-Funktion erhöht. Das ist zwar praktisch, wenn es nur wenige Elemente gibt, aber nicht machbar, wenn es viele Elemente gibt, weil das zu speicherintensiven, weniger effizienten Hash-Maps führen würde.
Brauchst du Wörterbücher?
Wörterbücher sind super, aber andere Datenstrukturen könnten für deine speziellen Daten und Bedürfnisse besser passen. Letztendlich unterstützen Wörterbücher keine gängigen Funktionen wie Indizierung, Slicing und Verkettung, was sie weniger flexibel macht und die Arbeit mit ihnen in bestimmten Situationen erschwert.
Alternative Python-Hashmap-Implementierungen
Wie schon gesagt, Python macht Hashmaps mit eingebauten Wörterbüchern. Man sollte aber wissen, dass es noch andere native Python-Tools und Bibliotheken von Drittanbietern gibt, mit denen man die Vorteile von Hashmaps nutzen kann.
Schauen wir uns ein paar der bekanntesten Beispiele an.
Standard-Dict
Jedes Mal, wenn du versuchst, auf einen Schlüssel zuzugreifen, der nicht in deinem Wörterbuch steht, gibt Python einen KeyError zurück. Eine Möglichkeit, das zu verhindern, ist, mit der Methode .get()
nach Infos zu suchen. Eine super Methode dafür ist die Verwendung von Defaultdict
, das im Modul collections
zu finden ist. Defaultdict
und Wörterbücher sind fast gleich. Der einzige Unterschied ist, dass Defaultdict
nie einen Fehler auslöst, weil es einen Standardwert für nicht vorhandene Schlüssel bereitstellt.
from collections import defaultdict
# Defining the dict
capitals = defaultdict(lambda: "The key doesn't exist")
capitals['Madrid'] = 'Spain'
capitals['Lisboa'] = 'Portugal'
print(capitals['Madrid'])
print(capitals['Lisboa'])
print(capitals['Ankara'])
# Expected output:
# Spain
# Portugal
# The key doesn't exist
Zähler
Counter
ist eine Unterklasse eines Python-Wörterbuchs, das speziell fürs Zählen von hashbaren Objekten entwickelt wurde. Es ist ein Wörterbuch, in dem Elemente als Schlüssel und ihre Anzahl als Werte gespeichert werden.
Es gibt mehrere Möglichkeiten, Counter
zu starten:
-
Durch eine Reihe von Elementen.
-
Nach Schlüsseln und Zählungen in einem Wörterbuch.
-
name:value
-Mapping verwenden.
from collections import Counter
# a new counter from an iterable
c1 = Counter(['aaa','bbb','aaa','ccc','ccc','aaa'])
# a new counter from a mapping
c2 = Counter({'red': 4, 'blue': 2})
# a new counter from keyword args
c3 = Counter(cats=4, dogs=8)
# print results
print(c1)
print(c2)
print(c3)
# Expected output:
# Counter({'aaa': 3, 'ccc': 2, 'bbb': 1})
# Counter({'red': 4, 'blue': 2})
# Counter({'dogs': 8, 'cats': 4})
Die Counter-Klasse hat ein paar praktische Methoden für gängige Berechnungen.
print('keys of the counter: ', c3.keys())
print('values of the counter: ',c3.values())
print('list with all elements: ', list(c3.elements()))
print('number of elements: ', c3.total()) # number elements
print('2 most common occurrences: ', c3.most_common(2)) # 2 most common occurrences
# Expected output:
# keys of the counter: dict_keys(['cats', 'dogs'])
# values of the counter: dict_values([4, 8])
# list with all elements: ['cats', 'cats', 'cats', 'cats', 'dogs', 'dogs', 'dogs', 'dogs', 'dogs', 'dogs', 'dogs', 'dogs']
# number of elements: 12
# 2 most common occurrences: [('dogs', 8), ('cats', 4)]
Scikit-learn-Hashing-Methoden
Scikit-learn, auch bekannt als sklearn, ist eine robuste Open-Source-Bibliothek für maschinelles Lernen in Python. Es wurde entwickelt, um die Implementierung von maschinellem Lernen und statistischen Modellen in Python einfacher zu machen.
Sklearn hat verschiedene Hash-Methoden, die bei der Feature-Engineering-Arbeit echt nützlich sein können.
Eine der häufigsten Methoden ist die CountVectorizer
-Methode. Es wird benutzt, um einen Text in einen Vektor umzuwandeln, basierend auf der Häufigkeit, mit der jedes Wort im ganzen Text vorkommt. Die Häufigkeit der Wörter ( CountVectorizer
) ist besonders nützlich bei der Textanalyse.
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
documents = ["Welcome to this new DataCamp Python course",
"Welcome to this new DataCamp R skill track",
"Welcome to this new DataCamp Data Analyst career track"]
# Create a Vectorizer Object
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documents)
# print unique values
print('unique words: ', vectorizer.get_feature_names_out())
# print sparse matrix with word frequency
pd.DataFrame(X.toarray(), columns = vectorizer.get_feature_names_out())
# Expected output:
# unique words: ['analyst' 'career' 'course' 'data' 'datacamp' 'new' 'python' 'skill'
# 'this' 'to' 'track' 'welcome']
Es gibt noch andere Hash-Methoden in sklearn, wie zum Beispiel FeatureHasher
und DictVectorizer
. Unsere Fallstudien Schulbudgetierung mit maschinellem Lernen in Python sind super Beispiele, um zu sehen, wie das in der Praxis funktioniert.
Fazit
Herzlichen Glückwunsch, dass du dieses Tutorial über Hashmaps durchgemacht hast. Wir hoffen, dass du jetzt Hashmaps und Python-Dictionaries besser verstehst. Wenn du mehr über Wörterbücher und ihre Verwendung in realen Szenarien erfahren möchtest, empfehlen wir dir, unser spezielles Python-Wörterbuch-Tutorial sowie unser Python-Wörterbuch-Verständnis-Tutorial zu lesen.
Wenn du gerade erst mit Python anfängst und mehr darüber lernen möchtest, schau dir den Kurs Einführung in die Datenwissenschaft mit Python von DataCamp an und check unser Python-Tutorial für Anfänger aus.

Ich bin freiberufliche Datenanalystin und arbeite mit Unternehmen und Organisationen auf der ganzen Welt an Data-Science-Projekten zusammen. Ich bin auch Ausbilder für Data Science mit mehr als 2 Jahren Erfahrung. Ich schreibe regelmäßig datenwissenschaftliche Artikel in englischer und spanischer Sprache, von denen einige auf etablierten Websites wie DataCamp, Towards Data Science und Analytics Vidhya veröffentlicht wurden. Als Datenwissenschaftlerin mit einem Hintergrund in Politik- und Rechtswissenschaften ist es mein Ziel, an der Schnittstelle von Politik, Recht und Technologie zu arbeiten und die Macht der Ideen zu nutzen, um innovative Lösungen und Erzählungen voranzutreiben, die uns dabei helfen können, dringende Herausforderungen wie die Klimakrise anzugehen. Ich betrachte mich als Autodidakt, der ständig lernt und ein überzeugter Verfechter der Multidisziplinarität ist. Es ist nie zu spät, neue Dinge zu lernen.