setdefault + erstes Element aus einer Liste

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
HugoB
User
Beiträge: 8
Registriert: Dienstag 29. März 2011, 08:27

Hallo,

ich bin noch neu in Sachen Python und stehe gerade vor folgendem Problem:

Ich habe ein dict, von dem ich nicht sicher sagen kann, ob alle Keys, die ich später verarbeiten muß, vorhanden sind. "setdefault" hilft mir hier schonmal bei meinem Problem. Hier mal ein vereinfachtes Codebeispiel:

Code: Alles auswählen

TEST={'mail': ['a@b.c', 'd@e.f', 'g@h.i'], 'lastName': ['Mustermann']}
print "Wert fuer mail: %s" % TEST.setdefault('mail', None)
print "Wert fuer lastName: %s" % TEST.setdefault('lastName', None)
Ausgabe:

Code: Alles auswählen

Wert fuer mail: ['a@b.c', 'd@e.f', 'g@h.i']
Wert fuer lastName: ['Mustermann']
Und jetzt mein Problem: Ich möchte, daß von den Keys, sofern sie existieren, nur das jeweils erste Feld aus der Liste ausgegeben wird:

Code: Alles auswählen

Wert fuer mail: a@b.c
Wert fuer lastName: Mustermann
Dafür würde mir z. B. "TEST["mail"][0]" helfen. Aber hier habe ich das Problem, daß evtl "mail" nicht vorhanden sein könnte. Wir kriege ich das alles kombiniert?

Python 2.4 (Ich kann auf dem System wo das Script später laufen wird, auch nicht auf eine neuere Version umsteigen).

Danke für's Helfen.
BlackJack

Also erst einmal brauchst Du hier `setdefault()` nicht. Das macht mehr als Du benötigst. Ein `get()` tut es auch.

Dann musst Du halt dafür sorgen das in dem Fall wo es keinen Eintrag gibt, ein Wert zurückgegeben wird, bei dem man per Indexzugriff an Index 0 auf das zugreifen kann, was Du ausgeben willst. Zum Beispiel eine Liste mit einem Element. Beispielsweise `None`: ``TEST.get('mail', [None])[0]``
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Ich möchte, daß von den Keys, sofern sie existieren,
Wenn es letztlich dann doch nur um die Keys geht, die ursprünglich existieren, spricht doch eigentlich auch nichts dagegen, einfach mit TEST["mail"][0] einen Zugriff zu versuchen und ggf. den KeyError abzufangen.

Anders gesagt:

Code: Alles auswählen

test={'mail': ['a@b.c', 'd@e.f', 'g@h.i'], 'lastName': ['Mustermann']}
try:
    print test["mail"][0]
except KeyError:
    print "Key not in dict"
Wenn "mail" nicht existiert, möchtest du ja vermutlich ohnehin einen Fehler ausgeben oder sowas. Beim Namen oder dem Betreff ist es sicher sinnvoll mit get(key, value) einen Standard-Wert anzunehmen - aber bei der Mailadresse...?

Besten Gruß,

brb
HugoB
User
Beiträge: 8
Registriert: Dienstag 29. März 2011, 08:27

get() ist genau was ich brauche. Vielen Dank. Ich hatte die Funktion zwar schon in der Doku gesehen, aber wohl übersehen, daß ich dort auch einen Default Wert mitgeben kann.

Aber noch aus Neugierde: Auch wenn setdefault() mehr macht, als ich brauche - würde es damit auch gehen? Ich hatte schon versucht dort den Index [0] unterzubringen. Aber erfolglos.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Das ist analog zu BlackJacks Beispiel:

Code: Alles auswählen

>>> t = {}
>>> print t.setdefault("asd", [None])[0]
None
>>> print t["asd"][0]
None
Besten Gruß,

brb
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Barabbas hat geschrieben: Wenn es letztlich dann doch nur um die Keys geht, die ursprünglich existieren, spricht doch eigentlich auch nichts dagegen, einfach mit TEST["mail"][0] einen Zugriff zu versuchen und ggf. den KeyError abzufangen.
Von 'ursprünglich' war aber bisher nicht die Rede.

Also haben wir hier den klassischen Streitfall, ob semantisch eine Ausnahme vorliegt, wenn ein Schlüssel nicht vorhanden ist, oder dies ein regulärer Fall ist.

Code: Alles auswählen

test={'mail': ['a@b.c', 'd@e.f', 'g@h.i'], 'lastName': ['Mustermann']}
test.get("mail")
# vs.
try:
    print test["mail"][0]
except KeyError:
    print "Key not in dict"
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Ja, sehe ich auch so, ich habe jetzt nur den Satz

Code: Alles auswählen

Ich möchte, daß von den Keys, sofern sie existieren
im Zusammenhang mit der Nutzung von setdefault() so verstanden, dass er eben "ursprünglich" meint. Oder ich wollte ihm einen Vorschlag unterbreiten, für den Fall, dass er "ursprünglich" meint oder so :)
Antworten