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
Liste von Objekten
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Oder als Klasse...
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:
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])
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:
Code: Alles auswählen
id_dict = {}
for i in query_return:
id_dict[i.id] = i
Code: Alles auswählen
id_dict = dict((i.id, i) for i in query_return)
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Er macht doch eh ein dict draus, was solls..DasIch hat geschrieben:@Dill statt der unnötigen LC sollte man besser eine generator expression nutzen.
Eben deswegen braucht man die Liste, die bei der LC erzeugt wird, nicht; kann sich diesen Zwischenschritt also sparen.
Genau deswegen nimmt man einen Generator. Wenn man eine Liste nicht braucht sollte man sie auch nicht erzeugen.Dauerbaustelle hat geschrieben:Er macht doch eh ein dict draus, was solls..
Die Änderungen in Python 3 diesbezüglich sind nicht grundlos.
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.
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?
>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.jerch hat geschrieben:Code: Alles auswählen
id_dict = dict((i.id, i) for i in query_return)
Code: Alles auswählen
In [9]: (i for i in range(1,10))
Out[9]: <generator object at 0x00F21080>
http://docs.python.org/3.0/whatsnew/3.0 ... d-of-listsDill hat geschrieben:was meinst du damit?