2016-12-11 3 views
1

Ich habe gelernt, verschachtelte Listen zu erstellen und zu verwalten, indem Sie eine NxM-Matrix erstellen und sie mit zufälligen Ganzzahlen füllen.Erstellen und füllen Sie jede Liste in einer Liste

Ich habe es gelöst über eine einfache Einliner und hatte Mühe, eine umfassende Lösung zu schreiben.

Ich nenne die erste Lösung als Betrug, weil ich diesen Tipp von dieser Website bekam, aber nicht ganz verstanden, wie es funktioniert. Also habe ich versucht, ein detaillierteres Stück Code selbst zu schreiben, was schwierig war, und ich bin mir nicht ganz sicher, ob ich es richtig verstanden habe.

Die ursprüngliche Lösung:

from random import randint 

size_n = int(input("Number of lists N ")) 
size_m = int(input("Number of elements M ")) 

matrix = [[randint(1,9) for m in range(size_m)] for n in range(size_n)] 
print(matrix) 

Ich hatte eine harte Zeit, um eine Liste der Liste mit den richtigen Ebenen der Schleifen in Schleifen zu erstellen. Ich lande mit der temporären Matrix, aber ich bin mir nicht sicher, ob es eine gute Lösung ist.

Die endgültige Lösung:

from random import randint 

size_n = int(input("Number of lists N ")) 
size_m = int(input("Number of elements M ")) 
matrix = [] 

for n in range(size_n): 
    tmp = [] 
    for m in range(size_m): 
     tmp.append(randint(1,9)) 
    matrix.append(tmp) 

print(matrix) 

Können Sie mir helfen, zu verstehen, was die richtige Lösung für die Aufgabe ist?

P.S. Ist es normal für Entwickler, nach einer anderen Lösung zu suchen, wenn der Code einfach funktioniert, aber Sie denken, dass es schöner sein könnte?

+1

Was betrügt List Comprehensions? Und um Ihre andere Frage zu beantworten, ob es normal ist oder nicht, finde ich es nicht falsch, nach eleganteren Lösungen zu suchen. – Iluvatar

+0

Was ist los mit Ihrer ursprünglichen Lösung? – TigerhawkT3

+0

Ich habe diesen Tipp von dieser Website bekommen, aber nicht ganz verstanden, wie es funktioniert. Also habe ich versucht, ein detaillierteres Stück Code selbst zu schreiben, was schwierig war, und ich bin mir nicht ganz sicher, ob ich es richtig verstanden habe. –

Antwort

0
matrix = [[randint(1,9) for m in range(size_m)] for n in range(size_n)] 

Sagen wir unsere size_n ist 5, für ein Beispiel. Dann range(size_n) gibt

[0, 1, 2, 3, 4] 

E. g. eine Liste von 5 aufeinanderfolgenden ganzen Zahlen mit 0 beginnend Wenn Sie etwas für jedes Element der Liste, erstellt, dass ein weitere Liste der gleichen Größe, zum Beispiel:

>>>[88 for n in range(size_n)] 
[88, 88, 88, 88, 88] 

Sie sind, natürlich, nicht durch einfache begrenzt Zahlen können Sie grundsätzlich alles erstellen. Zum Beispiel leere Listen:

>>>[[] for n in range(size_n)] 
[[], [], [], [], []] 

Dann natürlich die inneren Listen müssen nicht leer sein, können Sie sie mit Zahlen füllen:

>>>[[1, 2, 3] for n in range(size_n)] 
[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]] 

Oder Sie können einen anderen range Ausdruck verwenden innen:

>>> [[range(1, 4)] for n in range(5)] 
[[[1, 2, 3]], [[1, 2, 3]], [[1, 2, 3]], [[1, 2, 3]], [[1, 2, 3]]] 

Und können Sie die Liste Verständnis auf diesen inneren Listen nur die gleiche Art und Weise verwenden:

>>> [[randint(1, 9) for m in range(1, 4)] for n in range(5)] 
[[8, 4, 3], [6, 7, 2], [6, 8, 2], [9, 6, 1], [9, 1, 2]] 

können Sie gehen tiefer und tiefer, bis man sich langweilt oder aus der Erinnerung:

>>> [[[randint(1, 9) for n in range(1, 5)] for n in range(1, 4)] for n in range(5)] 
[[[2, 9, 6, 1], [6, 7, 4, 5], [5, 9, 1, 7]], [[5, 2, 9, 3], [1, 8, 9, 7], [8, 4, 4, 8]], [[4, 4, 7, 9], [7, 1, 4, 2], [7, 8, 7, 3]], [[4, 4, 9, 9], [8, 8, 9, 5], [6, 1, 3, 9]], [[5, 9, 3, 2], [7, 5, 4, 7], [7, 7, 4, 3]]] 

Verschachtelte Liste Verständnis ist in der Regel die richtige Lösung, sie sind leicht zu lesen, wenn Sie auf die Schreibweise zu gewöhnen. Verschachtelte Schleifen sind ebenfalls in Ordnung.

Es ist nichts falsch daran, nach besseren Möglichkeiten zu suchen, um Ihren Arbeitscode neu zu schreiben (ich würde sagen, es ist falsch, nicht zu schauen), es sei denn, Sie entwickeln eine ungesunde Besessenheit damit.

Für Python 3 range(5) gibt eigentlich nicht [0, 1, 2, 3, 4] direkt, aber für diese Aufgabe ist es effektiv die gleiche Sache.

Verwandte Themen