Liste von Objekten

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
Snoda
User
Beiträge: 32
Registriert: Mittwoch 1. Februar 2006, 14:34

Sonntag 26. April 2009, 17:57

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
Hello world!
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Sonntag 26. April 2009, 18:02

deutlicher kann sich ein dict doch kaum aufdrängen...
Snoda
User
Beiträge: 32
Registriert: Mittwoch 1. Februar 2006, 14:34

Sonntag 26. April 2009, 18:05

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... ? :wink:
Hello world!
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Sonntag 26. April 2009, 21:40

Oder als Klasse...
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Sonntag 26. April 2009, 21:57

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])
DasIch
User
Beiträge: 2450
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sonntag 26. April 2009, 22:27

@Dill statt der unnötigen LC sollte man besser eine generator expression nutzen.
jerch
User
Beiträge: 1630
Registriert: Mittwoch 4. März 2009, 14:19

Sonntag 26. April 2009, 22:30

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:

Code: Alles auswählen

id_dict = {}
for i in query_return:
    id_dict[i.id] = i
oder kürzer:

Code: Alles auswählen

id_dict = dict((i.id, i) for i in query_return)
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Sonntag 26. April 2009, 23:16

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..
BlackJack

Sonntag 26. April 2009, 23:30

Eben deswegen braucht man die Liste, die bei der LC erzeugt wird, nicht; kann sich diesen Zwischenschritt also sparen.
DasIch
User
Beiträge: 2450
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sonntag 26. April 2009, 23:37

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.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Montag 27. April 2009, 00:37

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.
jerch hat geschrieben:

Code: Alles auswählen

id_dict = dict((i.id, i) for i in query_return)
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?
DasIch
User
Beiträge: 2450
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Montag 27. April 2009, 01:04

Dill hat geschrieben:was meinst du damit?
http://docs.python.org/3.0/whatsnew/3.0 ... d-of-lists
Antworten