Seite 1 von 1

Listen generieren, Referenzen und Co

Verfasst: Donnerstag 28. Februar 2008, 11:27
von Hyperion
Hallo zusammen,

da hier einige heftige Python-Kenner präsent sind, stelle ich mal folgende Frage:
Wie kann man auf einfachste (oder schnellste oder beides?) Art Listen von Listen erzeugen, die mit einem konstanten Wert gefüllt sind?

Genauer: Ich brauche Listen von folgender Struktur:

Code: Alles auswählen

[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]
Dabei ist die Anzahl von einem Parameter (anz) abhängig und die Länge der inneren Listen ebenfalls von diesem, nur Minus 1! Also in diesem Bsp 4 mal die -1er-Listen und darin 3 mal die -1.

Ich habe das jetzt so gelöst:

Code: Alles auswählen

gruppe = [[-1] * (anz-1) for i in range(anz)]
Ist das so optimal? Wenn ja, wäre das ja in einem solchen Fall immer ein Idealkonzept!

Ich hatte davor folgende Lösung, die mir lange Zeit Kopfzerbrechen bereitet hat, da es sich nur um Referenzen der inneren Listen handelt, was in meinem Falle nicht gewünscht ist:

Code: Alles auswählen

gruppe = [[-1] * (anz-1)] * anz
Das diese daran: Beide Varianten ergeben bei der Ausgabe das gleiche - erst wenn man Werte darin ändert erlebt man die "böse" Überraschung ;)

Also zurück zur eigentlich Frage oben: Ist meine Lösung so gut und vertretbar? Oder geht es (noch) eleganter?

Verfasst: Donnerstag 28. Februar 2008, 14:27
von audax

Code: Alles auswählen

from itertools import repeat

def repeater(timesinner, timesouter, m=1):
    return repeat(repeat(m, timesinner), timesouter)
http://docs.python.org/lib/itertools-functions.html

Verfasst: Donnerstag 28. Februar 2008, 14:56
von BlackJack
@Hyperion: Diese "list comprehension" ist der übliche Weg. Ich würde `xrange()` statt `range()` verwenden.

Verfasst: Donnerstag 28. Februar 2008, 15:01
von audax
aber itertools.repeat ist to toll ;)

Verfasst: Donnerstag 28. Februar 2008, 15:10
von Hyperion
@BlackJack: Danke :-) Ja, ich sollte mir mal xrange angewöhnen ;-)

@Audax: Auch danke für den Tipp. Mit diesen Itertools sollte ich mich mal auseinandersetzen!