dict in dict

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
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

wie kriege ich aus eine Tabelle folgendes:

Code: Alles auswählen

daten={Arten:{"SuchZeit":{"XPath":"//div[@class='thumbsHolder elipsTxt']/div/div[@class='echThumb']//b[@class='tTm']",
                        },
                "SuchImage":{"XPath":"//div[@class='thumbsHolder elipsTxt']/div/div[@class='echThumb']/a/span/img",
                            "Attri":"data-original",
                        },
                "NummerID":{"XPath":"//div[@class='thumbsHolder elipsTxt']/div/div[@class='echThumb']/a[contains(@id,'videos')]",
                        },                
                "Regie":"",
                "Film":"",}}
eine HauptDictionaries "Arten"
eine unter Dictionaries, in meinem Fall ist das Zeile 0.
darin wieder ein Dictionaries Xpath, Attri usw.

wenn man mir nur zeigt, wie ich in ein dict ein dict packen kann, schaffe ich wohl den rest
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ernie1412: Einen Schlüssel-Wert-Paar einem Wörterbuch hinzufügen geht so: ``a_dictionary[key] = value``. Wobei `value` jedes beliebige Objekt sein kann. Also auch ein Wörterbuch. Alternativ wenn das Wörterbuch direkt als Literal erstellt werden kann, schreibt man ``a_dictionary = {key: value}``. Auch hier kann `value` wieder jedes beliebige Objekt sein. Also auch ein Wörterbuch.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
DeaD_EyE
User
Beiträge: 1244
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Bei Arten fehlten die Anführungszeichen:

Code: Alles auswählen

daten = {
    'Arten': {
        'SuchZeit': {
            'XPath': "//div[@class='thumbsHolderelipsTxt']/div/div[@class='echThumb']//b[@class='tTm']"
        },
        'SuchImage': {
            'XPath': "//div[@class='thumbsHolderelipsTxt']/div/div[@class='echThumb']/a/span/img",
            'Attri': 'data-original'
        },
        'NummerID': {
            'XPath': "//div[@class='thumbsHolderelipsTxt']/div/div[@class='echThumb']/a[contains(@id,'videos')]"
        },
        'Regie': '',
        'Film': ''
    }
}
Zugriff auf die zugewiesenen Werte von 'XPath':

Code: Alles auswählen

xpath_suchzeit = daten["Arten"]["SuchZeit"]["XPath"]
Oder über alle SubDicts iterieren und XPath ausgeben, wenn der Schlüssel vorhanden ist.

Code: Alles auswählen

xpath = "XPath"
for art, subdict in daten["Arten"].items():
    if xpath in subdict:
        print(f"{art:<10} -> {subdict[xpath]}")

Code: Alles auswählen

SuchZeit   -> //div[@class='thumbsHolderelipsTxt']/div/div[@class='echThumb']//b[@class='tTm']
SuchImage  -> //div[@class='thumbsHolderelipsTxt']/div/div[@class='echThumb']/a/span/img
NummerID   -> //div[@class='thumbsHolderelipsTxt']/div/div[@class='echThumb']/a[contains(@id,'videos')]
Am besten übst du das mal in der REPL.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

ich habs schon hinbekommen:
ich will AUS einer TABELLE die Werte so das sie in dieses dict Muster passen.
und nicht wie ich den dict auslesen kann.
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie sieht denn Deine Tabelle aus? Welchen Code hast Du? Was passt daran nicht?
Benutzeravatar
DeaD_EyE
User
Beiträge: 1244
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Ernie1412 hat geschrieben: Mittwoch 1. Juni 2022, 12:46 ich will AUS einer TABELLE die Werte so das sie in dieses dict Muster passen.
und nicht wie ich den dict auslesen kann.
Überlesen.
Wie ist nun deine Lösung?
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

Code: Alles auswählen

def webside_abspeichern(self):
        speichersatz={}
        webpage=self.lblWebside.text()    
        vertikal=[self.tblWdg_WebSides.verticalHeaderItem(r).text() for r in range(self.tblWdg_WebSides.rowCount())]
        horizontal=[self.tblWdg_WebSides.horizontalHeaderItem(r).text() for r in range(self.tblWdg_WebSides.columnCount())]        
        speichersatz=self.werte_eingabe(webpage,horizontal,vertikal)
        json_text = json.dumps(speichersatz, indent=4, ensure_ascii=False)
        print(json_text)

    def werte_eingabe(self,webpage,horizontal,vertikal):        
        speicher={}
        speichersatz={}
        spalte_0 = {}
        for zeile in range(len(vertikal)):    
            if self.tblWdg_WebSides.item(zeile, 1) is not None:                
                spalte_1bis8 = {}            
                for spalte, hori_header in enumerate(horizontal):                        
                    if self.tblWdg_WebSides.item(zeile, spalte) is not None:
                        spalte_1bis8[hori_header] =self.tblWdg_WebSides.item(zeile, spalte).text()           
                        name = f'{vertikal[zeile]}'
                        spalte_0[name] = spalte_1bis8
            else:
                name = f'{vertikal[zeile]}'
                spalte_0[name] = self.tblWdg_WebSides.item(zeile, 0).text()
        name = f'{webpage}'
        speicher[name]=spalte_0
        speichersatz=speicher[name]       
        return speichersatz
ich hab nur ein Problem:
speichern[name] zeigt er mir im debugger "{'startrek': {'Artist': {...}, 'Beschreibung': {...}, 'DateiOrdner': 'Y:\\_Labe...." an
speichersatz ist das ohne {'startrek':
Warum und wie kriege ich das da rein ?
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

antwort:
speichersatz[name]=spalte_0
return speichersatz

habs selber rausgefunden :)

diese ganzen Verschachtelungen da wirste bekloppt bei :)
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ernie1412: Erstmal ein bisschen Englisch: Es heisst „website“ und nicht „webside“. Einzelne Seiten einer Website heissen „pages“ und nicht „sides“. Ich vermute da sind Fehler in der Namensgebung.

Der Wert der ersten Definition von `speichersatz` in `webside_speichern()` wird nirgends verwendet.

`r` ist ein ungewöhnlicher Name für einen Laufindex. Die erste Wahl ist da `i`.

Bei f"{webpage}" und f"{vertikal[zeile]}" sind die f-Zeichenkettenliterale sinnlos weil das schon Zeichenketten sind und da genau der gleiche Wert wieder bei raus kommt, denn man da rein gesteckt hat.

Man sollte Namen nicht zu weit von der Stelle entfernt definieren wo sie verwendet werden. Wenn man `speicher` und `speichersatz` in `werte_eingabe()` dahin verschiebt wo sie letztlich gebraucht werden, dann sieht das Ende der Methode so aus:

Code: Alles auswählen

        speicher = {}
        speicher[webpage] = spalte_0
        speichersatz = {}
        speichersatz = speicher[webpage]
        return speichersatz
Und hier sieht man das die erste Definition von `speichersatz` gar nicht gebraucht wird. Und das man `speicher` auch gleich als Literal hinschreiben kann, statt erst leer zu erstellen und dann einen Wert zu setzen:

Code: Alles auswählen

        speicher = {webpage: spalte_0}
        speichersatz = speicher[webpage]
        return speichersatz
Jetzt ist das aber total unsinnig erst ein Wörterbuch zu erstellen mit einem Schlüssel/Wert-Paar und dann diesen einen Wert da wieder heraus zu holen. Das ist ja letztlich einfach nur das hier:

Code: Alles auswählen

        return spalte_0
Beim Code zum füllen von `spalte_0` fällt eine Asymmetrie auf: in der inneren Schleife wird `enumerate()` verwendet, in der äusseren nicht. Das sollte dort auch verwendet werden.

Die Zuweisung von `spalte_1bis8` als Wert in `spalte_0` steht an der falschen Stelle. Dort wird das immer und immer wieder gemacht, obwohl es immer das gleiche `spalte_1bis8`-Wörterbuch ist.

Zwischenstand (ungetestet):

Code: Alles auswählen

    def werte_eingabe(self, webpage, horizontal, vertikal):
        spalte_0 = {}
        for zeile, vertical_header in enumerate(vertikal):
            if self.tblWdg_WebSides.item(zeile, 1) is not None:
                spalte_1bis8 = {}
                for spalte, horizontal_header in enumerate(horizontal):
                    item = self.tblWdg_WebSides.item(zeile, spalte)
                    if item is not None:
                        spalte_1bis8[horizontal_header] = item.text()

                if spalte_1bis8:
                    spalte_0[vertical_header] = spalte_1bis8
            else:
                spalte_0[vertical_header] = self.tblWdg_WebSides.item(
                    zeile, 0
                ).text()

        return {webpage: spalte_0}
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

Code: Alles auswählen

{webpage: spalte_0}
meinste auf sowas einfaches mit der geschweiften Klammer bin ich gekommen ? :)

Code: Alles auswählen

item = self.tblWdg_WebSides.item(zeile, spalte)
wenn man sich den code nochmals anschaut, is klar warum
auch das mit dem vertical_header

wegen dem Englischen: Vieles ist ja heute "denglisch". ich versteh das besser wenn ich deutsch mit englisch vermische. Wird ja heutzutage in der Jugendsparache auch so gemacht.
header weils im code öfters steht und nicht kopfzeile, das versteht keiner :)

aber danke für dein Einwand. hab den code nun verbessert :)

nur "if spalte_1bis8:" ist mir nicht klar. warum eine zusätzliche if Anweisung ?
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ernie1412: Das ``if`` hatte ich weil an der Stelle wo die Zuweisung vorher stand sie ja nicht ausgeführt wurde wenn alle Elemente in der Zeile `None` gewesen wären. Ist natürlich quatsch weil der gesamte Code ja nur ausgeführt wird wenn an Index 1 das Element nicht `None` ist. Kann also weg die Bedingung.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten