Seite 1 von 1

Style Frage 2D Array

Verfasst: Dienstag 5. April 2005, 20:56
von Viel
Hi!

Ich kenne Python erst kurz, bin also noch neu.

Wie würde ihr den Code unten schreiben?
Der Code erzeugt ein 2D Array gefüllt mit Zufallszahlen.

Code: Alles auswählen

def Erzeuge_Spielfeld():
    
    import random
    
    y = 10
    x = 10
    iy = 0
    ix = 0
    feld = []
    
    while iy < y:
        spalte = []
        while ix < x:
            spalte.append(random.randint(1,5))
            ix = ix + 1
        feld.append(spalte)
        iy = iy + 1
        ix = 0
        del spalte
    return feld
        
print 'modul test.py wird ausgefuehrt'
Erzeuge_Spielfeld()
cu

Verfasst: Dienstag 5. April 2005, 21:09
von mawe
Hi!

Ich würds so in etwa machen:

Code: Alles auswählen

import random

x = 10
y = 10
feld = []
for i in range(x):
    feld.append([random.randint(1,5) for i in range(y)])
print feld
Gruß, mawe

Verfasst: Dienstag 5. April 2005, 21:32
von Viel
thx! so siehts schon schön aus.

Verfasst: Mittwoch 6. April 2005, 06:46
von CM
Hi

Wenn Du mehr "array-Power" haben willst, geht es auch mit numarray:

Code: Alles auswählen

from numarray.random_array import *
seed()
random((x,y))
Gruß,
Christian

Re: Style Frage 2D Array

Verfasst: Samstag 2. November 2024, 19:33
von __blackjack__
Im Beitrag von Viel ist das ``del`` unsinnig. Das löscht den Namen `spalte` der gleich darauf beim nächsten Schleifendurchlauf wieder definiert wird. Die Liste löscht das nicht, was auch fatal wäre, denn die wird ja noch als Element der umgebenden `feld`-Liste verwendet. Und die ``while``-Schleifen sind ja eigentlich ``for``-Schleifen:

Code: Alles auswählen

#!/usr/bin/env python3
import random
from pprint import pprint


def main():
    y = 10
    x = 10
    feld = []
    for _ in range(y):
        spalte = []
        for _ in range(x):
            spalte.append(random.randint(1, 5))
        feld.append(spalte)

    pprint(feld)


if __name__ == "__main__":
    main()
Beim Beitrag von mawe frage ich mich warum die einzelne Zeile (oder Spalte) mit einer „list comprehension“ erstellt wird, aber die das gesamte Feld mit einer Schleife und `append()`, statt das auch mit einer „list comprehension“ zu machen:

Code: Alles auswählen

#!/usr/bin/env python3
import random
from pprint import pprint


def main():
    x = 10
    y = 10
    feld = [[random.randint(1, 5) for _ in range(y)] for _ in range(x)]
    pprint(feld)


if __name__ == "__main__":
    main()
Das von CM vorgeschlagene `numarray`-Modul ist das letzte mal 2006 im Package-Index aktualisiert worden. Ich denke die Leute sind mittlerweile auf Numpy umgestiegen:

Code: Alles auswählen

#!/usr/bin/env python3
from numpy.random import default_rng


def main():
    x = 10
    y = 10
    feld = default_rng().integers(1, 5, (x, y))
    print(feld)


if __name__ == "__main__":
    main()