"Ist x in der Liste?"-Problem

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
Benutzeravatar
oreagel
User
Beiträge: 9
Registriert: Donnerstag 18. Dezember 2014, 19:47

Guten Abend,

auch wenn es sich komisch anfühlt, seinen ersten Post direkt mit einer (wahrscheinlich durchaus simplen) Frage zu schreiben,
komme ich mit meinem Code hier nicht weiter. Der ist auch keine Hausaufgabe, wir hatten heute die letzte Stunde Informatik vor den Ferien (und haben nur die Kursarbeit raus bekommen, 15Pkt :mrgreen: )

Vorher kurz:

Ich habe eine Liste a = [4, 7, 11, 18, 19, 23, 27, 48].
Ich gebe eine ganze positive Zahl ein, und mein Skript soll für mich herausfinden ob die Zahl in der Liste vorhanden ist oder nicht.
Mithilfe einer while-Schleife "halbiert" das Skript die Liste immer weiter bis ich entweder zu der eingegebenen Zahl komme oder die Liste leer ist.

So weit bin ich bis jetzt: http://www.python-forum.de/pastebin.php?mode=view&s=410

Ich finde jedoch mein Problem nicht und weiß auch nicht weiter, ich weiß natürlich dass ich das einfach mit "in" prüfen könnte aber ich will ja richtig mit Listen arbeiten lernen. Hoffentlich kann mir hier jemand weiter helfen. Danke im Voraus! :)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@oreagel: wie äußert sich das Problem? Gibt es eine Fehlermeldung?
Wenn Du nicht weiter kommst, hilft es, an strategisch günstigen Stellen Debugausgaben einzufügen.
Benutzeravatar
ngulam
User
Beiträge: 35
Registriert: Freitag 18. Oktober 2013, 11:03

Die Fehlermeldung ist doch eindeutig! (`int` hat keine Länge)

Zum Prüfen, ob die Eingabe ein Element der Liste ist, reicht doch ein einfaches:

Code: Alles auswählen

if x in a:
Warum dieses Stückwerk mit Listenlänge...?
งูหลาม
Benutzeravatar
oreagel
User
Beiträge: 9
Registriert: Donnerstag 18. Dezember 2014, 19:47

ngulam hat geschrieben:Die Fehlermeldung ist doch eindeutig! (`int` hat keine Länge) (....)
'int' braucht doch auch gar keine Länge zu haben, es soll ja nur mit den Listeneinträgen verglichen werden, oder überseh ich da was?
ngulam hat geschrieben:Zum Prüfen, ob die Eingabe ein Element der Liste ist, reicht doch ein einfaches:

Code: Alles auswählen

if x in a:
Warum dieses Stückwerk mit Listenlänge...?
Genau das wollte ich nicht verwenden. Es ist zwar nicht falsch, aber ich wollte mir mit diesem Skript die Art der binären Suche verinnerlichen.
Der Code ist damit zwar typisches "mit Kanonen auf Spatzen schießen", aber ich glaube das ist die einfachste Methode um mir die Binäre Suche einzuprügeln.


Zu "Sirius3":
Die Python Shell gibt mir einen IndexError, "list index out of range".
Ich hab jetzt mal eine kleine Debug-Zeile eingebaut, die mir immer anzeigt wie der Stand der Liste ist.
Nun, anscheinend hatte ich vergessen, zu prüfen, ob in meiner Liste überhaupt noch eine Zahl drin steht.

Versucht habe ich jetzt, immer, wenn die Zahl nicht gefunden wurde und geprüft wird ob die Stelle kleiner/größer x ist,
soll mein Skript prüfen ob die Liste noch eine Zahl enthält.
Das habe ich mit "if len(a) != 0:" probiert, sah dann so aus:

Code: Alles auswählen

            if len(a) != 0:
                a = a[:len(a) //2] # Liste wird linksseitig halbiert
            else:
                print(x," ist nicht vorhanden.")
                t = False # Liste leer
(für x < a[len(a)//2])

Wenn ich das ganze dann ausprobiere spuckt mein Programm trotzdem das aus:
Ganze positive Zahl 14
%DEBUG% a = [4, 7, 11, 18, 19, 23, 27, 48]
%DEBUG% a = [4, 7, 11, 18]
%DEBUG% a = [11]
%DEBUG% a = []
Traceback (most recent call last):
File "F:\x in a.py", line 15, in <module>
if a[len(a)//2] == x:
IndexError: list index out of range

Edit: Hab ein neues Snippet gemacht, damit man das auch mit verfolgen kann; http://www.python-forum.de/pastebin.php?mode=view&s=411
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@oreagel: na da kommt dann die Überprüfung, ob die Liste leer ist, zu spät. Schau auch nochmal genau, ob die Liste in der zweiten Zeile Deiner DEBUG-Ausgabe so sein sollte.
BlackJack

Mit ein bisschen Hilfe von der Standardbibliothek:

Code: Alles auswählen

from bisect import bisect_left

a = [4, 7, 11, 18, 19, 23, 27, 48]
b = 14
if a and a[bisect_left(a, b)] == b:
    print b, 'ist in', a, 'enthalten'
Benutzeravatar
oreagel
User
Beiträge: 9
Registriert: Donnerstag 18. Dezember 2014, 19:47

@BlackJack und @Sirius3
Danke, ich hab das jetzt mal beides berücksichtigt und es klappt alles :)

Vielen Dank an euch :)
Antworten