Wie kann man ein Diagramm in Python übersichtlich darstellen ? (Von vorne anfangen, dh keine Bibliotheken!)
Welche Datenstruktur (z. B. dicts / tuples / dict (tuples)) ist schnell, aber auch speichereffizient?
Man muss in der Lage sein, verschiedene Grafikoperationen durchzuführen .
Wie bereits erwähnt, können die verschiedenen Diagrammdarstellungen hilfreich sein. Wie implementiert man sie in Python?
Was die Bibliotheken betrifft, hat diese Frage ziemlich gute Antworten.
python
data-structures
graph
shad0w_wa1k3r
quelle
quelle
dict
vonlist
s vor. Grundsätzlich so etwas wie{<parent>: [<child>, ...], ...}
.Antworten:
Obwohl dies eine etwas alte Frage ist, dachte ich, ich würde jedem, der darüber stolpert, eine praktische Antwort geben.
Angenommen, Sie erhalten Ihre Eingabedaten für Ihre Verbindungen als Liste von Tupeln wie folgt:
Die Datenstruktur, die ich für Diagramme in Python als am nützlichsten und effizientesten befunden habe, ist ein Diktat von Mengen . Dies wird die zugrunde liegende Struktur für unsere
Graph
Klasse sein. Sie müssen auch wissen, ob diese Verbindungen Bögen (gerichtet, in eine Richtung verbunden) oder Kanten (ungerichtet, in beide Richtungen verbunden) sind. Wir werden das behandeln, indem wirdirected
derGraph.__init__
Methode einen Parameter hinzufügen . Wir werden auch einige andere hilfreiche Methoden hinzufügen.Ich werde es als "Übung für den Leser" belassen, eine
find_shortest_path
und andere Methoden zu erstellen .Lassen Sie uns dies in Aktion sehen ...
quelle
heapq
Bibliothek zu verwenden, um Listen von Tupeln anstelle von Mengen zu häufen. Zum Beispiel wäre das Diagramm ein Diktat von Haufen wie:_graph = {'A': heapify([(0.3, 'D'), (0.5, 'B'), (0.75, 'A'), (0.9, 'C')])}
(Hinweis: Sie würden dies nicht wirklich verwendenheapify
, lesen Sie die Hilfe für die Bibliothek), dann könnten Sie dieheapq
Funktionen verwenden, um die gewichteten Kanten einzufügen und abzurufen.log
zeitlichen Zugriff bedeuten . Aber wie kann man das Wörterbuch erweitern, mit dem Sie sowohl die Knoten-ID als auch das Gewicht zugeordnet haben?NetworkX ist eine großartige Python- Grafikbibliothek . Es wird Ihnen schwer fallen, etwas zu finden, das Sie brauchen und das es noch nicht tut.
Und es ist Open Source, sodass Sie sehen können, wie sie ihre Algorithmen implementiert haben. Sie können auch zusätzliche Algorithmen hinzufügen.
https://github.com/networkx/networkx/tree/master/networkx/algorithms
quelle
graph.py --> class Graph
. Und alles, was ich sehen möchte, ist, wie sie verwenden__iter__
.Erstens die Wahl der klassischen Liste vs. hängt Matrixdarstellungen vom Zweck ab (davon, was Sie mit der Darstellung tun möchten). Die bekannten Probleme und Algorithmen hängen mit der Wahl zusammen. Die Wahl der abstrakten Darstellung bestimmt, wie sie implementiert werden soll.
Zweitens stellt sich die Frage, ob die Eckpunkte und Kanten nur als Existenz ausgedrückt werden sollen oder ob sie zusätzliche Informationen enthalten.
Aus Sicht der in Python integrierten Datentypen wird jeder an anderer Stelle enthaltene Wert als (versteckter) Verweis auf das Zielobjekt ausgedrückt. Wenn es sich um eine Variable handelt (dh um eine benannte Referenz), werden der Name und die Referenz immer in einem (internen) Wörterbuch gespeichert. Wenn Sie keine Namen benötigen, kann die Referenz in Ihrem eigenen Container gespeichert werden - hier wird wahrscheinlich immer die Python-Liste für die Liste verwendet als Abstraktion verwendet.
Die Python-Liste ist als dynamisches Referenzarray implementiert. Das Python-Tupel ist als statisches Referenzarray mit konstantem Inhalt implementiert (der Wert der Referenzen kann nicht geändert werden). Aus diesem Grund können sie leicht indiziert werden. Auf diese Weise kann die Liste auch zur Implementierung von Matrizen verwendet werden.
Eine andere Möglichkeit, Matrizen darzustellen, sind die vom Standardmodul implementierten Arrays
array
- eingeschränkter in Bezug auf den gespeicherten Typ, homogener Wert. Die Elemente speichern den Wert direkt. (In der Liste werden stattdessen die Verweise auf die Wertobjekte gespeichert.) Auf diese Weise ist es speichereffizienter und auch der Zugriff auf den Wert ist schneller.Manchmal finden Sie nützliche noch eingeschränktere Darstellung wie
bytearray
.quelle
Es gibt zwei ausgezeichnete Graphbibliotheken NetworkX und igraph . Sie finden beide Bibliotheksquellcodes auf GitHub. Sie können immer sehen, wie die Funktionen geschrieben sind. Aber ich bevorzuge NetworkX, weil es leicht zu verstehen ist.
Sehen Sie sich ihre Codes an, um zu erfahren, wie sie die Funktionen ausführen. Sie erhalten mehrere Ideen und können dann auswählen, wie Sie mithilfe von Datenstrukturen ein Diagramm erstellen möchten.
quelle