Erster Dict-in-Dict-Eintrag

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
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

hallo
ich versuche aus meinem Dict

Code: Alles auswählen

dict = {"Auftragsstellen.xlsx": {"Tabelle3": [1, 2, 3], "Tabelle4": [4, 5, 6]
                                 },
        "Niederlassungen.xlsx": {"Tabelle1": [7, 8, 9], "Tabelle2": [10, 11, 12]
                                 }
        }
den ersten Eintrag: [1, 2, 3] auszulesen.
Bisher habe ich

Code: Alles auswählen

print(dict[list(dict)[0]])
(Ausgabe: {'Tabelle3': [1, 2, 3], 'Tabelle4': [4, 5, 6]})
und komm nicht weiter :cry:
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Da Wörterbücher keine Reihenfolge haben, ist `erster` ein Wort, das nicht sinnvoll ist. Wie man auf Wörterbücher zugreifen kann, steht in jeder Python-Einführung.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

dict ist ein doofer Name, weil das den Namen des eingebauten Datentypen ueberdeckt, und du dadurch Problem bekommen kannst. Genauso wie bei file und open etc.

Und wenn man ein Woerterbuch hat, dann greift man darauf per Schluessel zu. Wenn das Ergebnis davon wieder ein Woerterbuch ist, greift man darauf per Schluessel zu. Wenn das Ergebnis davon wieder ein Woerterbuch ist, greift man darauf per Schluessel zu. Wenn das Ergebnis wieder ein Woerterbuch ist, dann greift man darauf per Schluessel zu. Die Idee ist hoffentlich klar geworden.

Code: Alles auswählen

mein_super_benanntes_woerterbuch_das_weitere_woerterbuecher_enthaelt[ein_schluessel][ein_anderer_schluessel][noch_mehr_schluessel]
Was allerdings in deiner Datenstruktur komisch aussieht: das die untergeordneten Woerterbuecher verschiedene Schluessel haben. Neben generisch benannten und durchnummerierten "Tabelle3", "Tabelle4" etc vor allem auch verschiedene. Das riecht nach einem konzeptionellen Fehler.
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

Danke, aber Nein. Das Dict habe ich so genannt, weil es natürlich nur fürs forum als kurzes beispiel gedacht ist. Daher ist das denk ich ok.
(PS irgendjemand regt sich sowieso über irgendetwas auf...)
Daher meine Frage.
Die Grundsubstanz (sozusagen) ist bei wörterbüchern ja dict[0][0] in disem fall, aber wie setze ich das hier um?
@sirus: Ach und warum gibt es denn dieses forum eigentlich, wenns doch irgendwo steht?!
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Hey, wenn du den Key kennst (was bei dir der Fall ist) dann greifst du folgerndermaßen auf den dazugehörigen Value.

Code: Alles auswählen

print(dict["Auftragsstellen.xlsx"])
das liefert dir ein dict zurück:

Code: Alles auswählen

{'Tabelle3': [1, 2, 3], 'Tabelle4': [4, 5, 6]}
Das heißt, auch in diesem dict must du nach dach dem Value zu dem Key suchen, also:

Code: Alles auswählen

print(dict["Auftragsstellen.xlsx"]["Tabelle3"])
dann bekommst du auch

Code: Alles auswählen

[1, 2, 3]
raus.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hier wird gemeckert, wenn es was zu meckern gibt. Schlechte Namen, falsche Datenstrukturen, konzeptionelle Missverständnisse. Und es wird auch gelegentlich mal darauf hingewiesen, dass man nicht jede triviale Frage stellen muss, sondern sich das Selbst erarbeiten kann, anhand der Dokumentation.

Aber wenn das so eine Zumutung ist - irgendwo ist der Knopf, mit dem du dein Geld, das du hier für die Ratschläge bezahlst, zurück bekommst.
Benutzeravatar
noisefloor
User
Beiträge: 4194
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Ach und warum gibt es denn dieses forum eigentlich, wenns doch irgendwo steht?!
Sirius3 hat dir doch den essentiellen Hinweis geben: "Da Wörterbücher keine Reihenfolge haben, ist `erster` ein Wort, das nicht sinnvoll ist."

Das ist der entscheidende Punkt und der ist sehr konkret. Man hätte auch einfach antworten können: du hast noch eine grundlegendes Verständnisproblem bei den Datenstrukturen von Python, zurück zum Tutorial und finden den Fehler selberl. Hat aber keiner so gesagt.
Die Grundsubstanz (sozusagen) ist bei wörterbüchern ja dict[0][0] in disem fall, aber wie setze ich das hier um?
Nein, so greifst du auch eine Liste oder ein Tupel zu, aber nicht auf ein Dict. Das würde nur funktionieren, wenn das Dict einen Schlüssel namens `0` hätte und hinter dem Schlüssel wieder ein Dict liegt, was ebenfalls den Schlüssel `0` hat.

Code: Alles auswählen

>>> foo = {'spam': 1, 'egg': 2}
>>> foo[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 0
>>> foo2 = { 0: {0:'spam'}}
>>>
>>> foo2[0][0]
'spam'
>>>
Gruß, noisefloor
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Hier der Vollständigkeit halber noch der Verweis auf dict in der Python-Dokumentation.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Sirius3 hat geschrieben: Montag 16. Dezember 2019, 14:30 Da Wörterbücher keine Reihenfolge haben, ist `erster` ein Wort, das nicht sinnvoll ist. Wie man auf Wörterbücher zugreifen kann, steht in jeder Python-Einführung.
Haben Dictionaries nicht seit 3.7 eine Reihenfolge? (Reihenfolge, nicht Index)

Wenn du wirklich das erste Element wie oben angegeben haben willst (aus was für einem Grund auch immer) kannst du das ja mit zwei Schleifen lösen:

Code: Alles auswählen

dict = {"Auftragsstellen.xlsx": {"Tabelle3": [1, 2, 3], "Tabelle4": [4, 5, 6]
                                 },
        "Niederlassungen.xlsx": {"Tabelle1": [7, 8, 9], "Tabelle2": [10, 11, 12]
                                 }
        }



def give_first_element(dict):
    for v in dict.values():
        for v in v.values():
            return v


print(give_first_element(dict))
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@Jankie: In deinem Code wird "dict" überschrieben. Deine Funktion tut nicht das, was ihr Name andeutet.

Ich würde sagen, wenn man das so lösen möchte, dann ist ein dictionary die falsche Datenstruktur.
Benutzeravatar
noisefloor
User
Beiträge: 4194
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Haben Dictionaries nicht seit 3.7 eine Reihenfolge? (Reihenfolge, nicht Index)
Die Reihenfolge, in der eingefügt wird, bleibt erhalten. Das ist ab Python 3.7 ein "language feature". Damit ist aber ein Index-basierter Zugriff trotzdem nicht sinnvoll ;-)
"der erste" Eintrag hängt ja immer noch davon ab, was man zuerst eingefügt hat.

Und wenn du einen ein Python-Implementierung hast, die nicht Python 3.7 umsetzt, dann ist das ganze so oder so hinfällig.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`more_itertools` hat da so eine `first()`-Funktion:

Code: Alles auswählen

In [82]: from more_itertools import first                                       

In [83]: A                                                                      
Out[83]: 
{'Auftragsstellen.xlsx': {'Tabelle3': [1, 2, 3], 'Tabelle4': [4, 5, 6]},
 'Niederlassungen.xlsx': {'Tabelle1': [7, 8, 9], 'Tabelle2': [10, 11, 12]}}

In [84]: first(first(A.values()).values())                                      
Out[84]: [1, 2, 3]
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich wuerde trotzdem behaupten, das eine Datenstruktur deren Zugriff prinzipiell index-basiert erfolgen soll nicht mit Woerterbuechern erstellt werden sollte. Auch wenn die Einfuegereihenfolge jetzt fix die Ordnung definiert. Das Risiko da eines Tages boese zu erwachen, weil die neu-anlage eines Schluessel/Wertepaares sich anders verhaelt, als man denkt, ist es nicht wert.
Antworten