Seite 1 von 1
Liste von Objekten
Verfasst: Sonntag 26. April 2009, 17:57
von Snoda
Hallo Phytonier,
mein heutiges Proglem ist folgendes:
von einer MySQL-abfrage generiere ich eine Menge von Objekten. Diese Objekte haben alle das Attribut "ID".
Diese Objekte müssen in einem "Bündel" (Liste, Dict, etc..?) zurückgegeben werden. Ziel dabei ist später aus einzelne Objekte zuzugreifen, wenn ich nur die gewünschte ID kenne.
Dazu fallen mir folgende Möglichkeiten ein:
1. rückgabe eines Dictionarys mit ID:Objekt
2. rückgabe einer angepassten Liste mit überschreibenem __getitem__
Wie würde man das in sauberem Python ausdrücken? Oder nimmt man eine ganz andere Variante? Bitte sagt mir eure Meinung...
lg Snoda
Verfasst: Sonntag 26. April 2009, 18:02
von Dill
deutlicher kann sich ein dict doch kaum aufdrängen...
Verfasst: Sonntag 26. April 2009, 18:05
von Snoda
habe ich mir auch gedacht. Aber da das Objekt ja auch schon die ID als Attribut hat dachte ich, es gibt vielleicht einen schöneren Weg... ?

Verfasst: Sonntag 26. April 2009, 21:40
von Dauerbaustelle
Oder als Klasse...
Verfasst: Sonntag 26. April 2009, 21:57
von Dill
du willst ja ein "bündel" zurückgeben. also brauchst du doch mindestens mal ein tupel. da kannste dann auch direkt nen dict nehmen.
das dict kannst du dir aus deiner "Menge von Objekten" sehr schön zusammenbasteln:
Code: Alles auswählen
class foo:
def __init__(self, id):
self.id = id
l = [foo(1), foo(2), foo(3)]
dict([(f.id, f) for f in l])
Verfasst: Sonntag 26. April 2009, 22:27
von DasIch
@Dill statt der unnötigen LC sollte man besser eine generator expression nutzen.
Verfasst: Sonntag 26. April 2009, 22:30
von jerch
Meine Frage wäre da, wie generierst Du diese Menge von Objekten? An dieser Stelle könntest Du die Objekte schon in ein Dict verpacken. Ist Deine Menge von Objekten ein Query-Return, ist dieses auch iterierbar (je nach Anfragetechnik/ORM kommt da meist eine Liste oder ein Generator/iterable zurück). Dann ginge es derart:
oder kürzer:
Verfasst: Sonntag 26. April 2009, 23:16
von Dauerbaustelle
DasIch hat geschrieben:@Dill statt der unnötigen LC sollte man besser eine generator expression nutzen.
Er macht doch eh ein dict draus, was solls..
Verfasst: Sonntag 26. April 2009, 23:30
von BlackJack
Eben deswegen braucht man die Liste, die bei der LC erzeugt wird, nicht; kann sich diesen Zwischenschritt also sparen.
Verfasst: Sonntag 26. April 2009, 23:37
von DasIch
Dauerbaustelle hat geschrieben:Er macht doch eh ein dict draus, was solls..
Genau deswegen nimmt man einen Generator. Wenn man eine Liste nicht braucht sollte man sie auch nicht erzeugen.
Die Änderungen in Python 3 diesbezüglich sind nicht grundlos.
Verfasst: Montag 27. April 2009, 00:37
von Dill
ich bin halt einfach mal davon ausgegangen, dass seine daten in einer liste vorliegen. aber genauer als "menge von objekten" ist er ja nicht geworden.
>Die Änderungen in Python 3 diesbezüglich sind nicht grundlos.
was meinst du damit?
EDIT:
jetzt verstehe ich welche liste ihr meint.
so gehts ja auch.
Code: Alles auswählen
In [9]: (i for i in range(1,10))
Out[9]: <generator object at 0x00F21080>
und dieser generator wird bei der LC implizit auch erstellt. dort wird das ganze aber zwischenzeitlich noch in eine liste gepackt und dann von dict wieder ausgepackt oder wie?
Verfasst: Montag 27. April 2009, 01:04
von DasIch