2013-04-01 1 views
5

Ich versuche, eine Liste von Kacheln für ein Brettspiel aus einer XML-Datei, die eine Beschreibung der Kacheln enthält, zu erstellen. Die XML-Datei beschreibt jeden Fliesentyp und die Anzahl der Kacheln dieses Typs.Erstellen Sie einzelne Liste mit mehreren Instanzen von Objekten aus der zweiten Liste in Python

Bisher habe ich den folgenden Code bekommt, die mit genau einem jedem Kachel Typ eine Liste erstellt:

[Tile(el.id) for el in <tile descriptions>] 

gerne würde ich eine Liste mit der entsprechenden Anzahl von jeder Platte zu schaffen, zum Beispiel so etwas wie diese:

[Tile(el.id) * <el.n_tiles> for el in <tile descriptions>] 

Gibt es einen eleganten Einzeiler, dies zu tun, oder muß ich es lange Hand tun, indem Sie eine Liste für jede Kachel Art zu schaffen, und dann verketten?

+0

Mit anderen Worten, möchten Sie die Elemente der zurückgegebenen Liste selbst Listen sein, jeder der Länge 'el.n_tiles'? Wenn dies der Fall ist, bedenken Sie die Antwort der NPE. – jedwards

Antwort

3

Wie wäre:

[Tile(el.id) for el in <tile descriptions> for _ in range(el.n_tiles)] 
+0

Das hat den Trick gemacht. Vielen Dank! – Stefan

3

Der Code, den Sie mehrmals die gleichen innere Liste wiederholt geschrieben:

[Tile(el.id) * <el.n_tiles> for el in <tile descriptions>] 

Verwenden Sie stattdessen eine innere Liste Verständnis:

[[Tile(el.id) for i in range(<el.n_tiles>)] for el in <tile descriptions>] 

Wenn das Ziel darin besteht, eine einzelne verkettete Liste zu erstellen, kann die Sie ca n verwenden, um eine Liste Verständnis mit verschachtelten for-Schleifen:

[Tile(el.id) for el in <tile descriptions> for i in range(<el.n_tiles>)] 

Wenn Sie ein wenig weiter fortgeschritten ist, kann die gleiche Wirkung (Liste Abflachung) erreicht werden kann itertools.chain.from_iterable verwenden.

Hoffe, das hilft. Happy Gaming :-)

+0

Danke. Ich könnte das nicht so machen wie es ist ... ist die "r-Range" ein Tippfehler? Ohne das "r" lief es, aber ich hatte immer noch Mühe, es zum Laufen zu bringen. Werde auf innerer Liste nachlesen :-). – Stefan

+0

Ja, das war ein Tippfehler. Es ist jetzt behoben :-) –

+0

Danke. Same Tippfehler im zweiten Beispiel jetzt ... Kopieren und Einfügen Fehler? – Stefan