Angenommen, ich habe Mengen von Früchten in verschiedenen Farben, z. B. 24 blaue Bananen, 12 grüne Äpfel, 0 blaue Erdbeeren und so weiter. Ich möchte sie in einer Datenstruktur in Python organisieren, die eine einfache Auswahl und Sortierung ermöglicht. Meine Idee war, sie in ein Wörterbuch mit Tupeln als Schlüssel zu schreiben, z.
{ ('banana', 'blue' ): 24,
('apple', 'green'): 12,
('strawberry','blue' ): 0,
...
}
oder sogar Wörterbücher, z.
{ {'fruit': 'banana', 'color': 'blue' }: 24,
{'fruit': 'apple', 'color': 'green'}: 12,
{'fruit': 'strawberry','color': 'blue' }: 0,
...
}
Ich möchte zum Beispiel eine Liste aller blauen Früchte oder Bananen aller Farben abrufen oder dieses Wörterbuch nach dem Namen der Frucht sortieren. Gibt es Möglichkeiten, dies auf saubere Weise zu tun?
Es kann durchaus sein, dass Wörterbücher mit Tupeln als Schlüssel nicht der richtige Weg sind, um mit dieser Situation umzugehen.
Alle Vorschläge willkommen!
Antworten:
Persönlich ist eines der Dinge, die ich an Python liebe, die Tupel-Dikt-Kombination. Was Sie hier haben, ist effektiv ein 2d-Array (wobei x = Fruchtname und y = Farbe), und ich bin im Allgemeinen ein Befürworter des Diktats von Tupeln für die Implementierung von 2d-Arrays, zumindest wenn so etwas
numpy
oder eine Datenbank nicht geeigneter ist . Kurz gesagt, ich denke, Sie haben einen guten Ansatz.Beachten Sie, dass Sie Diktate nicht als Schlüssel in einem Diktat verwenden können, ohne zusätzliche Arbeit zu leisten. Dies ist also keine sehr gute Lösung.
Sie sollten jedoch auch namedtuple () berücksichtigen . Auf diese Weise können Sie Folgendes tun:
Jetzt können Sie Ihr Obstzählungs-Diktat verwenden:
Andere Tricks:
Wenn Sie chmullig wiederholen, um eine Liste aller Farben einer Frucht zu erhalten, müssten Sie die Schlüssel filtern, d. H.
quelle
name='banana'
?bananas = filter(lambda fruit: fruit.name=='banana', fruits)
oderbananas = [fruit for fruit in fruits if fruit.name=='banana']
. Dies ist eine Möglichkeit, mit der verschachtelte Dikte potenziell effizienter sind. Alles hängt davon ab, wie Sie die Daten verwenden möchten.count
Am besten erstellen Sie eine einfache Datenstruktur, um Ihre Daten zu modellieren. Anschließend können Sie diese Objekte in einer einfachen Liste speichern und nach Ihren Wünschen sortieren / abrufen.
In diesem Fall würde ich die folgende Klasse verwenden:
Anschließend können Sie einfach "Fruit" -Instanzen erstellen und einer Liste hinzufügen, wie auf folgende Weise gezeigt:
Die einfache Liste
fruits
wird viel einfacher, weniger verwirrend und besser gepflegt.Einige Anwendungsbeispiele:
Alle folgenden Ausgaben sind das Ergebnis nach dem Ausführen des angegebenen Code-Snippets, gefolgt von:
Unsortierte Liste:
Anzeigen:
Alphabetisch nach Namen sortiert:
Anzeigen:
Nach Menge sortiert:
Anzeigen:
Wo Farbe == rot:
Anzeigen:
quelle
Datenbank, Diktat der Diktate, Wörterbuch der Liste der Wörterbücher, benanntes Tupel (es ist eine Unterklasse), SQLite, Redundanz ... Ich traute meinen Augen nicht. Was sonst ?
Ja! ich dachte
Meiner Meinung nach reicht eine Liste von Tupeln aus:
Ergebnis
quelle
Ein Wörterbuch ist wahrscheinlich nicht das, was Sie in diesem Fall verwenden sollten. Eine Bibliothek mit mehr Funktionen wäre eine bessere Alternative. Wahrscheinlich eine echte Datenbank. Am einfachsten wäre SQLite . Sie können das Ganze im Speicher behalten, indem Sie anstelle eines Dateinamens die Zeichenfolge ': memory:' übergeben.
Wenn Sie diesen Pfad fortsetzen möchten, können Sie dies mit den zusätzlichen Attributen im Schlüssel oder im Wert tun. Ein Wörterbuch kann jedoch nicht der Schlüssel zu einem anderen Wörterbuch sein, sondern ein Tupel. In den Dokumenten wird erklärt, was zulässig ist. Es muss ein unveränderliches Objekt sein, das Zeichenfolgen, Zahlen und Tupel enthält, die nur Zeichenfolgen und Zahlen enthalten (und weitere Tupel, die nur diese Typen rekursiv enthalten ...).
Sie könnten Ihr erstes Beispiel mit machen
d = {('apple', 'red') : 4}
, aber es wird sehr schwierig sein, nach dem zu fragen, was Sie wollen. Sie müssten so etwas tun:quelle
Mit Schlüsseln als Tupel filtern Sie einfach die Schlüssel mit der angegebenen zweiten Komponente und sortieren sie:
Das Sortieren funktioniert, weil Tupel eine natürliche Reihenfolge haben, wenn ihre Komponenten eine natürliche Reihenfolge haben.
Mit Schlüsseln als eher vollwertigen Objekten filtern Sie einfach nach
k.color == 'blue'
.Sie können Diktate nicht wirklich als Schlüssel verwenden, aber Sie können eine einfachste Klasse erstellen
class Foo(object): pass
und im laufenden Betrieb beliebige Attribute hinzufügen:Diese Instanzen können als Diktatschlüssel dienen, aber achten Sie auf ihre Veränderbarkeit!
quelle
Sie könnten ein Wörterbuch haben, in dem die Einträge eine Liste anderer Wörterbücher enthalten:
Ausgabe:
Bearbeiten: Wie eumiro betonte, könnten Sie ein Wörterbuch von Wörterbüchern verwenden:
Ausgabe:
quelle
Diese Art von Daten wird effizient aus einer Trie-ähnlichen Datenstruktur abgerufen. Es ermöglicht auch eine schnelle Sortierung. Die Speichereffizienz ist jedoch möglicherweise nicht so hoch.
Ein traditioneller Versuch speichert jeden Buchstaben eines Wortes als Knoten im Baum. Aber in Ihrem Fall ist Ihr "Alphabet" anders. Sie speichern Zeichenfolgen anstelle von Zeichen.
es könnte ungefähr so aussehen:
siehe diesen Link: trie in python
quelle
Sie möchten zwei Tasten unabhängig voneinander verwenden, haben also zwei Möglichkeiten:
Speichern Sie die Daten redundant mit zwei Dikten als
{'banana' : {'blue' : 4, ...}, .... }
und{'blue': {'banana':4, ...} ...}
. Dann ist das Suchen und Sortieren einfach, aber Sie müssen sicherstellen, dass Sie die Diktate gemeinsam ändern.Speichern Sie es nur ein Diktat und schreiben Sie dann Funktionen, die über sie iterieren, z.
quelle