seltsame Fehlermeldung: IndentationError: unindent does not match any outer indentation level

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
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Hey,

nochmals danke für die Hilfe in meinem letzten Thread. Habe leider wieder ein kleines Problem in folgendem Code:
suche = input ("Geben Sie den Nachnamen der gesuchten Person ein ")
x = 0
größe = len(vornamen) -1
Treffer = []

while x <= größe:
if (namen[x] == suche):

Instanz=Person(namen[x],
Treffer.append(Instanz)

print ("Treffer", (Instanz.name), ", ", (Instanz.vorname))
x = x+1
continue
else:


x = x+1

if not len(Treffer):
print ("keine Treffer")
Ich erhalte für die Zeile if not len(Treffer): die Meldung :"IndentationError: unindent does not match any outer indentation level". Was könnte das sein? Eingerückt müsste ja alles ordnungsgemäß sein...
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Cortez: Wenn es ordnungsgemäss eingerückt wäre, dann würde diese Fehlermeldung nicht kommen. Ich bekomme die allerdings gar nicht erst, weil da vorher schon bei der Definition von `Instanz` ein Syntaxfehler ist. Die Zeile scheint nicht vollständig zu sein‽

Wenn ich den Fehler behebe, dann bekomme ich in der Tat die gleiche Ausnahme wegen der Einrückung, und die stimmt ja auch tatsächlich nicht.

Der Code sieht auch nicht gut aus. Das sieht so verdächtig nach parallel geführten Listen für Namen und Vornamen aus. Informationen die zusammengehören sollten nicht auf mehrere Listen verteilt werden.

In jedem Fall sollte die ``while``-Schleife eine ``for``-Schleife sein und den Index `x` solltest Du loswerden. Wenn Du mehrere parallele Listen für eine Schleife zusammenführen willst/musst, gibt es die `zip()`-Funktion. Wobei man wie gesagt, fragen sollte warum das überhaupt parallele Listen sind und nicht *eine* wo zum Beispiel Tupel mit den Informationen drin stecken.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Oder mit anderen Worten:

Code: Alles auswählen

suche = input ("Geben Sie den Nachnamen der gesuchten Person ein ")
treffer = [Person(n, v) for n,v in zip(namen,vornamen) if n == suche]
if not treffer:
    print("keine Treffer")
Wobei hier noch die Frage bleibt, warum `Person` nicht schon dann erzeugt wurde, als man Namen und Vornamen eingegeben hat.
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Zur Erklärung: Ich bin mir nicht sicher, was du mit paralleler Liste meinst, aber ich habe eine Liste angelegt (Treffer), in der die gefundenen Instanzen abgespeichert werden. Ich habe gesehen, dass ich bei der Definition von der Instanz den vornamen vergessen habe - bei mir klappt das jedenfalls.

Meiner Ansicht nach müsste das schon richtig eingerückt sein, weil "keine Übereinstimmung" soll er ja erst dann ausgeben wenn die Schleife durchgelaufen ist und die Liste leer ist...

P.S. was ist an der for Schleife besser? Weil man da x nicht extra definieren muss?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Cortez: Mit parallelen Listen sind `vorname` und `name` gemeint. In beiden Listen stehen am gleichen Index Werte die eigentlich zusammen gehören. So etwas sollte man nicht machen, weil es unübersichtlicher und fehleranfälliger ist. Und wenn man zur Verarbeitung die beiden Listen sowieso zusammenführen muss, könnte man die Werte gleich zusammen in *einer* Liste speichern.

Der Compiler ist sehr überzeugt das die Einrückung falsch ist. Und der hat an der Stelle immer recht. Denk mal nicht in Einrückebenen sondern in einzelnen Leerzeichen. Die Anzahl der führenden Leerzeichen sollte immer ein vielfaches von 4 sein. 9 ist das nicht.

Die ``for``-Schleife braucht kein `x` und man sieht dort bei einem `zip()` auch sofort im Schleifenkopf was Sache ist und muss sich nicht erst den ganzen Schleifenkörper durchlesen um zu sehen das es sich um parallel geführte Listen handelt. ”Schlimmer” noch: Wenn man so eine ``while``-Schleife sieht, dann geht man erst einmal davon aus, das es sich a) *nicht* um parallel geführte Listen handelt und/oder b) `x` nicht einfach nur hochgezählt wird. Denn sonst hätte der Autor des Codes ja eine ``for``-Schleife genommen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Achso, ich glaube, ich hab jetzt verstanden, was du meinst. Weil ich die 4 Datensätze, die ich habe (name, vorname) und die Listen für werte a und werte b, die dann später noch dazukommen, in verschiedene Variablen speichere, bevor ich damit die Instanz erzeuge und in Treffer sichere. Und mit der zip()-Funktion kann man diesen einen Schritt wohl sparen...

Siehs mir nach - python hat sicherlich tonnenweise Fumktionen, die in den gängigen Einsteigertutorials nicht erwähnt werden, aber dennoch notwendig sind. Ich denke, ich werd mich mal nach einem guten Nachschlagewerk umsehen, wo solche Dinge erläutert sind. Wäre ja z.B. auch mal interessant zu wissen, welche Funktionen die Module, die man importieren kann, so alles mit sich bringen.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Cortez: Nein die `zip()`-Funktion erspart einem das nicht, umgekehrt kannst Du Dir die `zip()`-Funktion sparen wenn Du gleich/vorher schon `Person`-Exemplare erzeugst, statt die Werte in einzelnen, parallelen Listen zu speichern. Du hättest dann nur noch eine Liste wo alle Daten zu den Personen zusammengefasst sind, und die Suche würde dann so aussehen:

Code: Alles auswählen

    nachname = input('Geben Sie den Nachnamen der gesuchten Person ein: ')
    treffer = [person for person in personen if person.nachname == nacnname]
    if not treffer:
        print('keine Treffer')
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten