Zugriff auf dicitonary ohne Namensverwendung

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
ytm81524
User
Beiträge: 12
Registriert: Mittwoch 15. Januar 2020, 03:38

Guten Tag,

an folgenden Link habe ich mir ein Beispiel genommen:
https://ubuntuforums.org/showthread.php?t=301487
dort wird mit

Code: Alles auswählen

firstval = thisdict["secondval"][0] #get first element
auf den Eintrag "secondval" des dictionaries zugegriffen. Ist es möglich statt dem Namen auch auf den ersten Eintrag zuzugreifen, sodass der Name unbekannt bleiben kann?
Ich stelle mir sinngemäß so etwas vor:

Code: Alles auswählen

firstval = thisdict[EINTAG EINS DES DICTIONARIES][0] #get first element
Vieln Dank für eure Hilfe
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

thisdict.values()[0]

Ich halte das aber für fragwürdig. Warum willst du das? Erst seit neueren Python Versionen ist die einfüge-Reihenfolge dafür verbindlich. Und bist du sicher, das ist die richtige Reihenfolge?
ytm81524
User
Beiträge: 12
Registriert: Mittwoch 15. Januar 2020, 03:38

Ja, es geht darum, Messdaten die immer im ersten Eintrg stehen zu extrahieren, um dann damit weiter zu arbeiten.
Leider funktioniert das bei mir nicht, obwohl ich Python aktuell habe.

Code: Alles auswählen

#first I create an empty dicitonary
thisdict = {}

#later I add in some values

thisdict["firstval"] = "1stval"
thisdict["secondval"] = ["2ndval", "3rdval"] #some values in the list

firstval = thisdict.values()[1] #get first element
Folgender Fehler tritt auf:

Code: Alles auswählen

    firstval = thisdict.values()[1] #get first element

TypeError: 'dict_values' object is not subscriptable
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich schrieb 0 nicht ohne Grund. Das ist der erste wert. Warum sind die messdaten nicht in einer Liste? Wenn du nach Reihenfolge zugreifen willst, ist das die bessere Datenstruktur.

Um meinen Vorschlag zu reparieren sollte eines von beiden gehen:

next(mydict.values())

oder zur Not

list(mydict.values())[0]
ytm81524
User
Beiträge: 12
Registriert: Mittwoch 15. Januar 2020, 03:38

Es scheint zwar nur die Notlösung zu sein, aber letzteres funktioniert. Bei ersterem erscheint:

Code: Alles auswählen

    firstval = next(thisdict.values()) #get first element

TypeError: 'dict_values' object is not an iterator
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Huh. Ich muss wohl noch Vertrauter werden mit Python 3 dicts. Wahrscheinlich fehlt da wiederum ein iter. Aber warum das so schwierig ist muss ich mal nachlesen.

Die Frage warum das ein Wörterbuch ist, wenn du doch per Stelle zugreifen willst, bleibt bestehen. Das riecht Fischig.
ytm81524
User
Beiträge: 12
Registriert: Mittwoch 15. Januar 2020, 03:38

Jetzt kommt mir in den Sinn was gemeint ist. Es ist ein Wörterbuch, weil ich es mit loadmat einlese, welches nunmal Wörterbücher erzeugt. Das habe ich von hier: https://towardsdatascience.com/how-to-l ... 200e1287b5, Kapitel Loading .mat files
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Suchst du nicht eher dein_dict["annotations"][0] oder handelt es sich bei dir um eine andere Art von Datei als die aus dem Link?

Ansonsten bitte noch etwas mehr Infos zum Zusammenhang geben. Dein Ansatz klingt komisch und womöglich kann man das sauberer lösen. Was sagt list(dein_dict.items()) denn?
ytm81524
User
Beiträge: 12
Registriert: Mittwoch 15. Januar 2020, 03:38

Es handelt sich um eine andere Art von Datei. Also die eigentliche Idee war ja, statt mit dem Namen auf einen Eintrag im Wörterbuch zuzugreifen, einfach den ersten Eintrag (beispielhaft) auszuwählen. Mit

Code: Alles auswählen

test = list(thisdict.items())
wird mein wörterbuch in eine Liste umgewandelt, allerings komplett und nicht nur ein selektierter Eintrag. Mein kompletter Code dazu steht ja als Beispiel oben schon.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Zeig doch mal, wie das dict aussieht und welchen Wert du davon brauchst.
Mit einem Index auf den Wert eines dicts zuzugreifen ist ungewöhnlich, in den meisten Fällen falsch.
Zuletzt geändert von sparrow am Mittwoch 15. Januar 2020, 09:34, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, es ist keine gute Idee, statt mit dem Namen irgendwelche zufälligen Werte zu nehmen. Bei einem Wörterbuch (vor allem, wenn es aus anderen Quellen kommt) gibt es keine Reihenfolge.

Was ist der Grund, warum Du nicht Namen verwenden willst?
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Es ging mir um die Rückgabe des Aufrufs. Was da passiert, weiß ich selbst. ;)
ytm81524
User
Beiträge: 12
Registriert: Mittwoch 15. Januar 2020, 03:38

@ sparrow
Das dict ist das, was ich oben erstellt habe. Darin möchte ich auf den zweiten Eintrag zugreifen: "secondval". Statt diesen mit seinem Namen aufzurufen, möchte ich ihn mit seinem Index aufrufen, da ich ja weiß, dass er sich an zweiter Stelle befindet.

@ Sirius3
Den Namen möchte ich nicht verwenden, da sich dieser unterscheidet je nach Wörterbuch. Der eintrag jedoch bleibt an Stelle 2.

@ snafu
Hier stehe ich etwas auf dem Schlauch. Was ist mit Rückgabe gemeint? Es läuft bei mir fehlerfrei ohne Probleme durch und erstellt eben eine Liste aus dem Wörterbuch.
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ytm81524: Woher weisst Du denn das sich der Eintrag an ”zweiter Stelle” befindet? Wie wird das garantiert oder wer garantiert das? Garantiert Matlab das Variablen in einer *.mat-Datei neben einem Namen auch eine feste Reihenfolge haben? Kann man das irgendwo nachlesen? Selbst wenn es eine Reihenfolge gibt, wie kannst Du sicher sein, dass die auch überall gleich ist? Wenn man das beim schreiben/erstellen der Dateien sicherstellt, könnte man dort auch einen festen Namen sicherstellen.

Und selbst wenn die Reihenfolge in der Datei existieren sollte, ist das bei einem Wörterbuch erst ab Python 3.6 sichergestellt. Das sollte man eventuell prüfen um Überraschungen zu vermeiden, oder explizit selbst ein `collections.OrderedDict` zum füllen übergeben.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
ytm81524
User
Beiträge: 12
Registriert: Mittwoch 15. Januar 2020, 03:38

In meinem konkreten Fall ist das garantiert, ob das allgemeingültig ist? Ich denke tatsächlich auch eher nicht. Es sind nur 10 .mat Files. Es ist schon richtig, dass ich gerade bei nur 10 Files auch jedes mit seinem Namen ansprechend könnte. Bei 10 ist das noch einigermaßen übersichtlich.
Ja man hätte das bei der Erstellung der Datei beachten können, allerdings war dort die Idee, über den Variablennamen noch zusätzliche Informationen zu übermitteln, weshalb diese alle verschieden sind.
Zumindest ich verwende Python 3.7.
Antworten