Ditctionary mit Tupel Keys nach Key durchsuchen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mampfgnom
User
Beiträge: 8
Registriert: Mittwoch 6. Juni 2012, 10:10

Hallo liebe Python Gemeinde.

Vorweg ich bin nur ein Python Gelegenheitsnutzer, der einige grundlegende Funktionen von Python kennt. Deswegen sei es mir bitte verziehen, wenn ich nicht sofort eure Vorschläge verstehe. Allerdings nehme ich auch gerne neue Tipps und Ratschläge auf und versuche dadurch mein "Pythongehacke" zu verbessern^^

Also mein Problem:

Ich habe ein Dictionary dessen Keys Tupel mit 4 Einträgen sind. Davon sind die ersten 3 Einträge Koordinaten und der vierte Eintrag eine Nummer, also ungefähr so:

Code: Alles auswählen

d = {}
d[(x, y, z, NR)] = ...
Die NR sind einmalig, kommen also jeweils in nur genau einem Key Tupel vor. Jetzt möchte ich gerne gezielt den Key des Dictionarys finden, in dem eine bestimmte NR liegt. Also den key, der einen bestimmten vierten Eintrag im Tupel hat. Meine einzige Idee wäre bis jetzt nur über alle Keys zu iterieren, bis ich den Key mit dem entsprechendem vierten Eintrag im Tupel gefunden habe. Also ungefähr so:

Code: Alles auswählen

for i in d:
      if (i[3] == wert):
##            und jetzt hab ich ihn gefunden
Allerdings wird das Dictionary durchaus mehrere Hundert Tausend Keys besitzen und dann erscheint mir das ganze nicht mehr so effektiv. Gibt es für mein Problem vielleicht eine elegantere Lösung?

Liebe Grüße

Mampfgnom
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Ja: pass deine Datenstruktur dem Problem an.

1. Das ist kein Dictionary.

Wenn ein Eintrag einmalig ist, eignet der sich prima als Schlüssel eines Dictionary.

Code: Alles auswählen

{NR: (x, y, z)}
mampfgnom
User
Beiträge: 8
Registriert: Mittwoch 6. Juni 2012, 10:10

Hallo und Danke schon mal für die Antwort. So ganz verstehe ich nicht was du meinst. Hier mal 2 Beispiele für Einträge meines Dictionarys:

Code: Alles auswählen

d[(1,1,1,1)] = [1,0]
d[(1,3,2,2)] = [3,2]
Was meinst du mit
sparrow hat geschrieben: 1. Das ist kein Dictionary.
?
mampfgnom
User
Beiträge: 8
Registriert: Mittwoch 6. Juni 2012, 10:10

Du hast mich aber gerade auf eine Idee gebracht. Ich verwende einfach zwei dictionarys:

Code: Alles auswählen

nummer = {}
position = {}

nummer[NR] = [1,0]
position[NR] = (x,y,z)
Dadurch lässt sich alles anhand der NR ansprechen. Allerdings funktioniert diese Lösung denke ich nicht so gut, wenn ich mein ursprüngliches dictionary nach mehreren Sachen durchsuchen will. Also beispielsweise nach NR und der Z-Koordinate.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

sparrow meinte das, was du mit deinem position-Dictionary umgesetzt hast. Bzw. wahrscheinlich etwas erweitert, so dass du keine zwei Dictionaries brauchst:

Code: Alles auswählen

d = {}
d[NR] = (x, y, z), [1, 0]
Wenn du aber nach mehreren Spalten abfragen möchtest, dann solltest du aber vielleicht über eine Datenbank nachdenken. Das nimmt dir eine Menge an Arbeit ab und ist genau auf solche Anfragen optimiert. Im Prinzip musst du dafür auch nichts großartiges Aufsetzen, mit SQLite kannst du sogar die ganze Datenbank nur im Speicher erzeugen, da fallen nicht einmal Dateien an.
Das Leben ist wie ein Tennisball.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Oh sorry, ich hatte deine zweite Zeile falsch gelesen, bzw. das = dahinter übersehen.

Mit einem Dictionary hast du Zugriff auf ein Element über einen Schlüssel. Die Implementierung kümmert sich darum, dass der Zugriff so sehr effizient ist. Die Frageist, wie sinnvoll dann deine Wahl des Schlüssels ist. Wenn du eh alle Schlüssel des Dictionaries durchsuche musst, könntest du ebensogut in einer Liste danach suchen.

Wenn der Wert nicht eindeutig ist, er sich also nicht als Index eignet, kannst du auf die Liste einen Filter anwenden.

Bei der Datenmenge, da hat EyDu recht, macht eine Datenbank Sinn.
BlackJack

@mampfgnom: Dann müsstest Du Dir ein zusätzliches Wörterbuch anlegen was die Z-Koordinate oder gar ein Tupel aus NR und Z-Koordinate auf den Rest abbildet. Die Frage ist, ob sich das alles überhaupt lohnt. Und ob Du hier nicht gerade dabei bist eine relationale Datenbank nachzubauen.

Um hier ein passende Antort zu geben, müsstest Du im voraus wissen wieviele Daten das ungefähr sind, und wie oft nach welchen Suchkriterien darauf zugegriffen wird. Also letztendlich die gleichen Fragen, die man sich bei einer Datenbank auch stellen muss, wenn man überlegt welche Indexe man für eine Tabelle anlegen möchte. Denn nichts anderes sind Deine Wörterbücher ja.

Bei dem bisher vorhandenen macht es jedenfalls keinen Sinn die Koordinaten mit im Schlüssel zu haben, wenn die ebenfalls enthaltene NR eindeutig ist. Denn dann würde die ja ausreichen um auf den Wert zuzugreifen. Man könnte also so als Grunddatenstruktur ein Wörterbuch nehmen, dass NR auf Koordinaten und die beiden bisherigen Werte abbildet. Um Dein Beispiel zu übernehmen:

Code: Alles auswählen

d = { 1: (1, (1, 1, 1), [1, 0]), 2: (2, (1, 3, 2), [3, 2]) }
Allerdings auch nur falls tatsächlich jemals über die NR auf die Werte zugegriffen wird. Sonst macht das nicht viel Sinn.

Wenn man weitere Wörterbücher für den Zugriff auf diese anlegt, dann sollte man das in einer Klasse kapseln falls diese Wörterbücher nicht nur lokal, temporär angelegt werden. Damit man sicherstellen kann, das alle Datenstrukuren verändert werden, wenn man Änderungen vornimmt. Überhaupt würde ich fast schon zu Klassen oder zumindest `collections.namedtuple` greifen bei diesen Daten, um diesen ganzen „anonymen” Zahlen Namen geben zu können, damit man im Quelltext besser sieht was da eigentlich vor sich geht.
mampfgnom
User
Beiträge: 8
Registriert: Mittwoch 6. Juni 2012, 10:10

Vielen Dank für eure Antworten. Ich habe jetzt die Variante von EyDu genommen und komme damit ganz gut klar. In Datenbanken und Klassen will ich mich jetzt nicht extra einarbeiten, weil mir dazu momentan die Zeit fehlt. Ich werde es aber auf jeden Fall im Hinterkopf behalten.

Grüße,

Mampfgnom
Antworten