Style Frage 2D Array

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
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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
Viel

thx! so siehts schon schön aus.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Benutzeravatar
__blackjack__
User
Beiträge: 14237
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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()
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
Antworten