expertenaustausch > comp.lang.* > comp.lang.python

Florian Lindner (22.03.2008, 16:23)
Hallo,
ich habe folgende Datenstruktur:

[('href', '#Arabic'), ('class', 'BottomLinks'), ('onclick',
"ShowLanguage('ar')")]

Also eine Liste die aus 2-Tupeln besteht. Nun würde ich gerne nach dem
Tupel ("href", "irgendwas") suchen und wenn es existiert, dass
"irgendwas" auslesen. Wie man das von Hand mittels Schleife und if
machen kann ist klar, aber ich frage mich, ob es da eine elegantere
Methode gibt?

Danke,

Florian
Diez B. Roggisch (22.03.2008, 16:36)
Florian Lindner schrieb:
> Hallo,
> ich habe folgende Datenstruktur:
> [('href', '#Arabic'), ('class', 'BottomLinks'), ('onclick',
> "ShowLanguage('ar')")]
> Also eine Liste die aus 2-Tupeln besteht. Nun würde ich gerne nach dem
> Tupel ("href", "irgendwas") suchen und wenn es existiert, dass
> "irgendwas" auslesen. Wie man das von Hand mittels Schleife und if
> machen kann ist klar, aber ich frage mich, ob es da eine elegantere
> Methode gibt?


[t for t in l if t[0] == 'href'][0]

Natuerlich nur wenn du 100%ig weisst, das es da ist. Sonst gibbet nen
IndexError - den du abfangen musst.

Diez
Volker Grabsch (22.03.2008, 18:38)
Diez B. Roggisch <deets> schrieb:
> Florian Lindner schrieb:
>> [('href', '#Arabic'), ('class', 'BottomLinks'), ('onclick',
>> "ShowLanguage('ar')")]
>> Also eine Liste die aus 2-Tupeln besteht. Nun würde ich gerne nach dem
>> Tupel ("href", "irgendwas") suchen und wenn es existiert, dass
>> "irgendwas" auslesen.


Wenn du mehrere solcher Anfragen hast, ist die Datenstruktur
ungeeignet. Genau für diesen Job gibt es Dictionaries: Einfach
zu handhaben und - gerade in Python - hocheffizient implementiert.

Deine Liste von Paaren (2-Tupeln) kannst du direkt in ein
Dictionary konvertieren:

daten_alt = [('href', '#Arabic'),
('class', 'BottomLinks'),
('onclick', "ShowLanguage('ar')")]

daten = dict(daten_alt)

Oder du erzeugst die Datenstruktur gleich als Dictionary:

daten = { 'href': '#Arabic',
'class': 'BottomLinks',
'onclick': "ShowLanguage('ar')" }

>> Wie man das von Hand mittels Schleife und if
>> machen kann ist klar, aber ich frage mich, ob es da eine elegantere
>> Methode gibt?

> [t for t in l if t[0] == 'href'][0]


Bei einem Dictionary kannst du direkt suchen:

daten['href']

> Natuerlich nur wenn du 100%ig weisst, das es da ist. Sonst gibbet nen
> IndexError - den du abfangen musst.


Das Dictionary wirft stattdessen einen KeyError, der in diesem
Fall auch die "richtigere" Exception ist.

Gruß,

Volker
Thomas Rachel (24.03.2008, 10:51)
Volker Grabsch schrieb:
> Diez B. Roggisch <deets> schrieb:
> Wenn du mehrere solcher Anfragen hast, ist die Datenstruktur
> ungeeignet. Genau für diesen Job gibt es Dictionaries: Einfach
> zu handhaben und - gerade in Python - hocheffizient implementiert.


Problem hier: wenn ich Daten wie

[('href', '#Arabic'), ('class', 'BottomLinks'), ('href', 'andererString')]

habe, funktioniert das so nicht.

Wenn sowas passieren kann (also potentielle Keyduplikate), hilft folgendes:

d={}
for k,v in l:
d.setdefault(k,[]).append(v)

> Bei einem Dictionary kannst du direkt suchen:
> daten['href']
>> Natuerlich nur wenn du 100%ig weisst, das es da ist. Sonst gibbet nen
>> IndexError - den du abfangen musst.


Oder mit daten.get('href','DEFAULT') umgehen kannst, so es denn im
angegebenen Kontext sinnvoll ist.

HTH,

Thomas
Ähnliche Themen