In einem (mehrdimensionalen) Dictionary suchen.

  • Hier mal das gekürzte Dict, was ich durchsuchen möchte:

    Das Dict ist auf nötigste gekürzt. Das einzige, was immer einzigartig ist, ist die Nummer. Diese kann niemals doppelt vorkommen. Das Dict wird generiert es gibt auch keine Reihenfolge wie die Daten kommen. Wie man Sieht, kann man das dict bei "sub" unendlich fortführen.

    So. Nun zu meiner Frage:

    Kann man in einem so verschachtelten Dict eine bestimmte "ID" Suchen und dort bei "sub" was einfügen, ohne unendlich viele Schleifen durchlaufen zu lassen?

  • Hallo,

    wo kommt das denn her? (Hast du Einfluss auf die Darstellung oder bekommst du den Datensatz genau so?) Könnte es nicht sein, dass das ein JSON-Objekt hätte werden sollen?


    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Könntest du uns verraten, was der Hintergrund ist? Das ist doch ne hierarchische Struktur. Ein Dict, das Dicts enthält, die Dicts enthalten, ...
    Sicher steht da in der Realität nicht überall "None" und nichts drin. Möglicherweise gibt es einen einfacheren Ansatz, wenn man die Aufgabenstellund kennt. So klingt das alles jedenfalls etwas sperrig und der Sinn erschließt sich einem nicht.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Das ist eine typische Baumstruktur, und die kann man mit bekannten Algorithmen durchsuchen.

    Beliebt ist das rekursive Verfahren: gehe von einem Key zum naechsten und rufe dich dann selber auf, Das terminiert weil entweder das gesuchte Element gefunden wird oder alle Keys untersucht sind.

    Oder man setzt alle Keys die man findet in eine Liste, und arbeitet die Liste ab. Wenn man neue Keys findet haengt man sie einfach an die Liste.

    Auch das terminiert weil der Algorithmus so lange laeuft bis das Element gefunden wurde oder die Liste leer wird.

  • Als erstes: BESTEN DANK an alle, die hier geantwortet haben. Geholfen hat @Tell sein Post. Aber dazu später.

    @Dennis89: mit JSON hatte ich anfangs rumexperimentiert. Kommt aber aufs selbe hinaus (kann aber auch sein, dass ich da nicht so affin drin bin). Die Daten bekomme ich so aus meiner Datenbank.

    @Gnom: Wir sind ja nicht bei der CIA, Ich will ein paar Abhängigkeiten darstellen. Es ist so am einfachsten, weil dann muss ich nur einen DB abruf machen und nicht bei jedem loop. In der Realität sind da extrem viele andere Daten noch vorhanden, aber das hätte hier den Rahmen gesprengt :)

    Tell: Tja, das ist genau das was ich gesucht habe. An einem Rekursiven Verfahren habe ich tatsächlich nicht gedacht. Vielen Dank dafür :)

    framp: Die Geschwindigkeit ist hier tatsächlich nebensächlich. Die Abfrage wird nur einmal pro loop gemacht. Wenn runtime neue Daten kommen sollten prüft eine andere distanz ob ein neustart bzw das neue einlesen von nöten ist.

  • Was meine Frage nach den Hintergründen der Aufgabe mit der CIA zu tun hat, müsstest du mir erläutern.

    Ich bin sehr sicher, dass es weitaus bessere Lösungen gibt, als dieses verschachtelte Dict, um hierarschische Strukturen schnell durchsuchbar und erweiterbar zu machen. Wenn die Datenbank vernünftig strukturiert ist, kannst du dir den ganzen Aufwand komplett sparen.

    Aber wenn du uns partout nicht sagen willst, um was es eigentlich geht, dann halt nicht.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • @Gnom das mit der CIA sollte ein Witz werden, der nach hinten los ging :)

    Mir geht es darum, dass ich die Datenbank (der Inhalt ist meiner, die Struktur ist vorgegeben) Nur einmal auslesen muss, die Daten (egal wie verschachtelt) in einem Dict packe und dann im Programm mit arbeiten kann. Aber um diese extrem verschachtelten Daten so hinzubekommen brauchte ich hilfe.

  • Vielleicht musst du sie nicht so komplex verschachteln, wenn du sie geeignet indizierst.

    Wenn ich dich richtig verstehe, kann an jeder Stelle, in jeder Hierarchiestufe wieder ein Eintrag eingefügt werden.

    Wie wäre es, wenn du die Einträge in einer Art Liste führst (ich kenn mich mit Liste, Dict, Tupel, Set nicht so aus und weiß daher nicht, was sich am besten eignet), in der jeweils die Hierarchiestufe vermerkt ist?

    0, 1, xxx, yyy

    1, 4, xxx, yyy

    1, 7, xxx, yyy

    1, 8, xxx, yyy

    2, 9, xxx, yyy

    2, 10, xxx, yyy

    Die Liste muss aber sortiert sein, das ist wichtig. Die erste Zahl gibt die Hierarchiestufe an. 9 ist auf Hierarchiestufe 2 und folglich hierarchisch unter 8 (Stufe 1) eingefügt. Das ist leicht zu durchsuchen und du kannst jederzeit was einfügen oder löschen.

    Als dict könnte das so aussehen, dass du die Nummern als Key führst und die Hierarchiestufe in die Daten aufnimmst.

    {

    1: [0, None, xxx, yyy}

    4: [1, None, xxx, yyy}

    7: [1, None, xxx, yyy}

    8: [1, None, xxx, yyy}

    9: [2, None, xxx, yyy}

    10: [2, None, xxx, yyy}

    ...

    }

    Wie sind denn diese Daten in der Datenbank strukturiert? Die Hierarchischen Beziehungen müssen dort ja auch abgebildet sein.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Du bekommst die denkbar schlechteste mögliche Struktur zur Repräsentation der Daten auf Auge gedrückt.

    • Die Rekursionstiefe imperativer Sprachen wird vom Arbeitsspeicher begrenzt. Bei Python und Ruby gibt es ein Software-Limit für die Rekursionstiefe. Auch C ist imperativ und hat aufgrund endlicher Ressourcen eine endliche Rekursionstiefe. Wenn man IPython verwendet, wird sie auf 3000 erhöht und bei CPython ist das Rekursionslimit 1000. Man kann es mit sys.setrecursionlimit setzen. Funktionale Sprachen haben dieses Limit nicht. Funktionale Sprachen kennen aber auch keine Schleifen und Funktionen haben keine inneren Zustände.
    • Stark verschachtelte Datenstrukturen können das Rekursionslimit erreichen, sofern man rekursiv vorgeht.
    • Um das Rekursionslimit in imperativen Sprachen zu umgehen, muss man die Rekursion in Iteration umwandeln.
    • Manchmal muss man mit solchen Datenstrukturen arbeiten. Oft ist die rekursive Verarbeitung einfacher als die iterative.
    • Wenn man solche Datenstrukturen vermeiden kann, dann sollte man das vermeiden.
    • Verwende eine Datenbank, wenn du Daten abrufen willst.
    • Flache Datenstrukturen sind einfacher als verschachtelte.

    So hier ein Versuch das Iterativ zu lösen:


    Einfacher wäre z.B. diese Struktur, die sich auch einfach als CSV abbilden lässt und umgekehrt.

    Zitat

    result_not_found={}
    result_found={'id': 27, 'info': 'Das ist ID 27', 'members': []}

    Der Name id ist von mir schlecht gewählt. In einem dict als str ist das in Ordnung. Wenn man aber ein Objekt dem Namen id zuweist, überlädt man die Funktion id, die von einem Objekt die id ausgibt. Das ist nicht ganz so tragisch, wenn das nur innerhalb einer Funktion geschieht, da diese Namen auf Modulebene nicht erreichbar sind. Aber wenn man z.B. etwas id auf Modulebene zuweist, können auch die Funktionen innerhalb des Moduls nicht auf die Funktion id zugreifen.

    Das war wieder eindeutig zu viel.

    Wie zuvor erwähnt, machs als CSV oder als Liste.

    Einmal editiert, zuletzt von RestlessMud46765 (27. Juli 2022 um 23:43)

  • Du willst Daten einfügen... müssen die dann nicht in die Datenbank zurückgeschrieben werden?

    Was interessiert dich an den Daten überhaupt? Müssen die so kompliziert verschachtelt sein? Musst du den ganzen komplexen Baum "beherrschen" oder gehts dir mehr um einzelne Abhängigkeiten?
    Um wie viele Datensätze geht es eigentlich? Was willst du da rausziehen oder wie viel in die Struktur einfügen und wozu?

    Ohne Einblick in die eigentliche Aufgabe ist es ziemlich schwierig, dir irgendwas zu raten. Jedenfalls vermute ich, dass man es nur schwerlich komplizierter machen kann, als es jetzt ist.

    Abgesehen davon ist "mehrdimensionales" Dictionary eher unzutreffend - "verschachtelt" würde es besser treffen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!