Mein Szenario lautet wie folgt: Ich habe eine Datentabelle (eine Handvoll Felder, weniger als hundert Zeilen), die ich in meinem Programm häufig verwende. Ich brauche diese Daten auch, um dauerhaft zu sein, also speichere ich sie als CSV und lade sie beim Start. Ich entscheide mich, keine Datenbank zu verwenden, da jede Option (auch SQLite) ein Overkill für meine bescheidene Anforderung ist (auch - ich möchte die Werte auf einfache Weise offline bearbeiten können und nichts ist einfacher als der Editor).
Angenommen, meine Daten sehen wie folgt aus (in der Datei ist das Komma ohne Titel getrennt, dies ist nur eine Illustration):
Row | Name | Year | Priority
------------------------------------
1 | Cat | 1998 | 1
2 | Fish | 1998 | 2
3 | Dog | 1999 | 1
4 | Aardvark | 2000 | 1
5 | Wallaby | 2000 | 1
6 | Zebra | 2001 | 3
Anmerkungen:
- Zeile kann ein "realer" Wert sein, der in die Datei geschrieben wird, oder nur ein automatisch generierter Wert, der die Zeilennummer darstellt. So oder so existiert es im Speicher.
- Namen sind einzigartig.
Dinge, die ich mit den Daten mache:
- Suchen Sie eine Zeile basierend auf ID (Iteration) oder Name (direkter Zugriff).
- Zeigen Sie die Tabelle in verschiedenen Reihenfolgen an, basierend auf mehreren Feldern: Ich muss sie z. B. nach Priorität und dann nach Jahr oder nach Jahr und dann nach Priorität usw. sortieren.
- Ich muss Instanzen basierend auf Parametersätzen zählen, z. B. wie viele Zeilen ihr Jahr zwischen 1997 und 2002 haben oder wie viele Zeilen 1998 und Priorität> 2 usw. sind.
Ich weiß, dass dies nach SQL "schreit" ...
Ich versuche herauszufinden, was die beste Wahl für die Datenstruktur ist. Es folgen verschiedene Möglichkeiten, die ich sehe:
Liste der Zeilenlisten:
a = []
a.append( [1, "Cat", 1998, 1] )
a.append( [2, "Fish", 1998, 2] )
a.append( [3, "Dog", 1999, 1] )
...
Liste der Spaltenlisten (es wird offensichtlich eine API für add_row usw. geben):
a = []
a.append( [1, 2, 3, 4, 5, 6] )
a.append( ["Cat", "Fish", "Dog", "Aardvark", "Wallaby", "Zebra"] )
a.append( [1998, 1998, 1999, 2000, 2000, 2001] )
a.append( [1, 2, 1, 1, 1, 3] )
Wörterbuch der Spaltenlisten (Konstanten können erstellt werden, um die Zeichenfolgenschlüssel zu ersetzen):
a = {}
a['ID'] = [1, 2, 3, 4, 5, 6]
a['Name'] = ["Cat", "Fish", "Dog", "Aardvark", "Wallaby", "Zebra"]
a['Year'] = [1998, 1998, 1999, 2000, 2000, 2001]
a['Priority'] = [1, 2, 1, 1, 1, 3]
Wörterbuch mit Schlüsseln als Tupel von (Zeile, Feld):
Create constants to avoid string searching
NAME=1
YEAR=2
PRIORITY=3
a={}
a[(1, NAME)] = "Cat"
a[(1, YEAR)] = 1998
a[(1, PRIORITY)] = 1
a[(2, NAME)] = "Fish"
a[(2, YEAR)] = 1998
a[(2, PRIORITY)] = 2
...
Und ich bin mir sicher, dass es andere Wege gibt ... Jeder Weg hat jedoch Nachteile, wenn es um meine Anforderungen geht (komplexe Bestellung und Zählung).
Was ist der empfohlene Ansatz?
BEARBEITEN:
Zur Verdeutlichung ist die Leistung für mich kein großes Problem. Da die Tabelle so klein ist, glaube ich, dass fast jede Operation im Bereich von Millisekunden liegen wird, was für meine Anwendung kein Problem darstellt.