Seite 1 von 1
					
				Liste eingeben lassen?
				Verfasst: Montag 27. Dezember 2010, 16:07
				von stuff16
				Hallo Leute,
ich versuche ein Programm zu schreiben, das überprüft ob ein 2-Dimensionales Feld ein Magisches Quadrat ist.
Aber ich scheitere schon ganz am Anfang, wie kann ich einen Benutzer dieses Feld eingeben lassen?
Ich hab schon einige Erfahrung mit C, dort hab ich einfach zwei for-schleifen gebaut und f[y][x] eingesetzt.
Hier bei Python scheint das nicht zu funktionieren, könnt ihr mir helfen?
Code: Alles auswählen
groesse=int(raw_input('Bitte Groesse des Feldes eingeben: '))
for y in range(0,groesse):
    for x in range(0,groesse):
        f[y][x]=int(raw_input('Feldelement eingeben: '))
 
			 
			
					
				Re: Liste eingeben lassen?
				Verfasst: Montag 27. Dezember 2010, 16:14
				von Pekh
				Es ist immer ganz hilfreich zu wissen, welcher Fehler denn Auftritt (Traceback), bzw. worin das von dir beobachtete Fehlverhalten besteht. In diesem Fall tippe ich auf einen IndexError, weil f vor der Schleife noch nicht mit entsprechenden Feldern initialisiert wurde.
			 
			
					
				Re: Liste eingeben lassen?
				Verfasst: Montag 27. Dezember 2010, 16:24
				von cofi
				Oder auf einen `NameError`, weil `f` gar nicht existiert 
Alternative mit List Comprehensions:
Code: Alles auswählen
>>> f = [[raw_input() for x in range (2)] for y in range(3)]
1
2
3
4
5
6
>>> print f
[[1, 2], [3, 4], [5, 6]]
 
			 
			
					
				Re: Liste eingeben lassen?
				Verfasst: Montag 27. Dezember 2010, 16:44
				von derdon
				Du empfiehlst ``input`` bei jemanden, der Python 2.x nutzt? Warum?
Edit: @cofi: 2≠3, Beim TE sind diese Werte aber immer gleich.
			 
			
					
				Re: Liste eingeben lassen?
				Verfasst: Montag 27. Dezember 2010, 16:51
				von cofi
				Aus Nachlässigkeit, werde das gleich richten.
Es fehlt sogar die Abfrage! Also bitte man muss dem OP doch nicht alles vorkauen.
			 
			
					
				Re: Liste eingeben lassen?
				Verfasst: Montag 27. Dezember 2010, 16:58
				von BlackJack
				@stuff16: Grunsätzlich denke ich, sollte man im Kopf behalten, dass man in Python in der Regel keine Listen mit bestimmten Grössen mit irgendwelchen Platzhalterdaten oder "zufälligem Datenmüll" vorbelegt und dort dann über Indexvariablen die "richtigen" Werte einsetzt, wie das zum Beispiel in C üblich ist, sondern eher die Listen dynamisch erzeugt und erweitert.  Also mit einer leeren Liste für das Ergebnis beginnt.  Dann in der äusseren Schleife für jede "Zeile" der Datenstruktur eine leere Liste erzeugt und an diese die einzelnen Werte für die Zeile anhängt, und am Ende der äusseren Schleife die Zeilenliste an die Ergebnisliste anhängt.
			 
			
					
				Re: Liste eingeben lassen?
				Verfasst: Montag 27. Dezember 2010, 18:35
				von stuff16
				Danke schonmal für die vielen Antworten!
Richtig, war ein "Name Error"! Sorry, hätte ich gleich dazuschreiben sollen 
@cofi: Das funktionier schonmal nicht schlecht! Gibt es vielleicht noch eine Möglichkeit, die eingabe so zu verändern, dass jedes mal angezeigt wird, welches Feldelement der Benutzer gerade eingibt? ("Zeile 1 Spalte 3 eingeben: ")
Ich hab mir das gerade so gedacht, dass ich deiner Methode erstmal diese Matrix erstelle, und in jedes Element mal 0 reinschreib. Danach kann ich mit meiner Methode nämlich darauf zugreifen!
Allerdings kommt mir das recht umständlich vor, da muss es doch etwas besseres geben..
Offensichtlich ist das Problem, dass ich die Schleife, mit der ich die Daten einlese, nicht unterbrechen kann, oder?
 
			 
			
					
				Re: Liste eingeben lassen?
				Verfasst: Montag 27. Dezember 2010, 19:28
				von cofi
				`x` und `y` sind die Indices der Schleifen, also ja die Nummerierung geht ohne weiteres. Unterbrechen kann man die implizite Schleife aber nicht.
Erzaehl uns doch was dein eigentliches Problem ist, wie BlackJack schon gesagt hat kann man das u.U. besser/pythonischer angehen.
			 
			
					
				Re: Liste eingeben lassen?
				Verfasst: Dienstag 28. Dezember 2010, 15:27
				von stuff16
				Mein Problem war, dass angezeigt werden soll, welches Feldelement gerade eingegeben werden soll, also welche Zeile und welche Spalte.
Cofi, wenn ich deine Methode verwende, funktioniert das zwar, aber ich kann immer nur denselben Text ausgeben lassen.
Ich habs jetzt mal so gelöst: 
Code: Alles auswählen
groesse=int(raw_input('Bitte Groesse des Feldes eingeben: '))
f = [[0 for x in range (groesse)] for y in range(groesse)]
for x in range(groesse):
    for y in range(groesse):
        print 'Zeile',x+1, ', Spalte',y+1,': '
        f[x][y]=raw_input()
for i in range(groesse):
    print f[i]
Bin ein kleiner Perfektionist, ich leg auf solche Sachen großen Wert 

Jetzt die Frage, gibt es noch elegantere Methoden, um das zu lösen?
 
			 
			
					
				Re: Liste eingeben lassen?
				Verfasst: Dienstag 28. Dezember 2010, 15:44
				von cofi
				Da das Abbrechen doch nicht so wichtig zu sein scheint:
Code: Alles auswählen
groesse=int(raw_input('Bitte Groesse des Feldes eingeben: '))
f = [[raw_input('Zeile {0}, Spalte {1}: '.format(x,y)) for y in xrange (1, groesse+1)] for x in xrange(1, groesse+1)]
for row in f:
    print row
Edit: Und ohne LC:
Code: Alles auswählen
groesse=int(raw_input('Bitte Groesse des Feldes eingeben: '))
f = list()
for x in xrange(1, groesse+1):
    row = list()
    f.append(row)
    for y in xrange(1, groesse+1):
        row.append(raw_input('Zeile {0}, Spalte {1}: '.format(x,y)))
for row in f:
    print row
 
			 
			
					
				Re: Liste eingeben lassen?
				Verfasst: Dienstag 28. Dezember 2010, 16:18
				von stuff16
				aahh, genau nach diesem ".format(x,y)" habe ich gesucht, danke!! Wunderbar funktioniert das (:
Eine Frage noch, dann geb ich schon Ruhe 

Und wo ist der unterschied zwischen range und xrange?
 
			 
			
					
				Re: Liste eingeben lassen?
				Verfasst: Dienstag 28. Dezember 2010, 16:24
				von cofi
				`range` erzeugt eine Liste, `xrange` einen Generator, d.h. letzteres ist speicherschonender.