Liste eingeben lassen?

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
stuff16
User
Beiträge: 4
Registriert: Montag 27. Dezember 2010, 15:54

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: '))
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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]]
Zuletzt geändert von cofi am Montag 27. Dezember 2010, 16:51, insgesamt 1-mal geändert.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Du empfiehlst ``input`` bei jemanden, der Python 2.x nutzt? Warum?


Edit: @cofi: 2≠3, Beim TE sind diese Werte aber immer gleich.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Aus Nachlässigkeit, werde das gleich richten.

Es fehlt sogar die Abfrage! Also bitte man muss dem OP doch nicht alles vorkauen.
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.
stuff16
User
Beiträge: 4
Registriert: Montag 27. Dezember 2010, 15:54

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

`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.
stuff16
User
Beiträge: 4
Registriert: Montag 27. Dezember 2010, 15:54

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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
stuff16
User
Beiträge: 4
Registriert: Montag 27. Dezember 2010, 15:54

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

`range` erzeugt eine Liste, `xrange` einen Generator, d.h. letzteres ist speicherschonender.
Antworten