Listen generieren, Referenzen und Co

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Donnerstag 28. Februar 2008, 11:27

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?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Donnerstag 28. Februar 2008, 14:27

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
BlackJack

Donnerstag 28. Februar 2008, 14:56

@Hyperion: Diese "list comprehension" ist der übliche Weg. Ich würde `xrange()` statt `range()` verwenden.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Donnerstag 28. Februar 2008, 15:01

aber itertools.repeat ist to toll ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Donnerstag 28. Februar 2008, 15:10

@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!
Antworten