2012-03-31 6 views
2

Ich versuche, meine matrix mit Nullen zu füllen. Leider, im folgenden Beispiel Variablen x und y sind redundant:Redundante Variable beim Erstellen Matrix nach Listenverständnis

self.matrix = [[0 for x in range(0, self.N)] for y in range(0, self.N)] 

Liste Multipliziert, kopieren Sie nur Verweise, was natürlich nicht das, was ich erwarte:

>>> matrix = [[0] * 5] * 5 
>>> matrix 
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 
>>> matrix[1][1] = "X" 
>>> matrix 
[[0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0]] 

So ist es eine Lösung mit einem Listenverständnis Redundanzvariablen zu vermeiden (x & y)?

+1

@Ashwini: Wie ist das hilfreich? –

+0

Wenn ich nicht falsch liege, dann ist sein Problem, dass wenn er einem bestimmten Listenelement einen Wert hinzufügt, es auch zu den anderen Listen innerhalb der Liste namens Matrix hinzugefügt wird. und http://stackoverflow.com/a/8713681/846892 erläutert dieses Verhalten von Listen. –

+2

@AshwiniChaudhary: Er weiß über dieses Verhalten. Die Frage ist eine ganz andere, aber ... –

Antwort

5

Die gemeinsame Idiom ist das Ergebnis der Variablen _, zuweisen, die einen möglichen Leser Ihres Codes signalisiert, dass der Wert nicht verwendet werden:

[[0]*self.N for _ in range(self.N)] 

Wie Sie sehen, können wir die [0]*size Idiom verwenden für die innere Liste, weil 0 ein unveränderlicher Wert ist. Sie können auch range mit nur einem Argument aufrufen. In diesem Fall wird es als obere Grenze behandelt, wobei 0 die untere Grenze ist.

Wenn Sie möchten, können Sie sich eine Liste Build-Helfer bauen, das Erstellen von Listen beliebiger Schachtelungstiefe unterstützt:

def make_multi_list(dim, func): 
    if not dim: return func() 
    return [make_multi_list(dim[1:], func) for _ in range(dim[0])] 

Verbrauch:

>>> make_multi_list((2, 2), lambda: 0) 
[[0, 0], [0, 0]] 
>>> make_multi_list((3, 2, 1), lambda: 0) 
[[[0], [0]], [[0], [0]], [[0], [0]]] 
+0

Danke, das ist was ich suche! Und sehr schönes Beispiel hast du mich erwischt. – IProblemFactory

1

Alternativ Sie tun können:

 
from itertools import repeat 

self.matrix = [list(repeat(0, self.N)) for _ in range(0, self.N)] 
+1

Danke, du hast Recht. Ich habe den Code korrigiert. Die Verwendung der Wiederholungsfunktion ist nicht erforderlich, wenn die Sprache diese Funktion bereits unterstützt. –