Seite 1 von 1

setdefault + erstes Element aus einer Liste

Verfasst: Dienstag 29. März 2011, 08:47
von HugoB
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.

Re: setdefault + erstes Element aus einer Liste

Verfasst: Dienstag 29. März 2011, 08:57
von 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]``

Re: setdefault + erstes Element aus einer Liste

Verfasst: Dienstag 29. März 2011, 09:07
von Barabbas
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

Re: setdefault + erstes Element aus einer Liste

Verfasst: Dienstag 29. März 2011, 09:09
von HugoB
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.

Re: setdefault + erstes Element aus einer Liste

Verfasst: Dienstag 29. März 2011, 09:38
von Barabbas
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

Re: setdefault + erstes Element aus einer Liste

Verfasst: Dienstag 29. März 2011, 10:29
von Hyperion
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"

Re: setdefault + erstes Element aus einer Liste

Verfasst: Dienstag 29. März 2011, 11:23
von Barabbas
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 :)