Kleiner Fehler in einer einfachen Funktion

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
pythonguy
User
Beiträge: 28
Registriert: Donnerstag 22. November 2007, 18:51

Code: Alles auswählen

def f1(l):
    for i in range(0,len(l)):
        if l[i]%10 != l[i]:
            del(l[i])
            l.append(l[i]%10)
    return l
Die Funktion kriegt eine Liste und soll immer die letzte Ziffer in die neue Liste einfügen (Modulo 10). Leider komme ich nicht drauf, wo der Fehler in dieser Funktion steckt, es sollte eigentlich das machen, was ich will :? Kann mir jemand einen Tipp geben?
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

pythonguy hat geschrieben:

Code: Alles auswählen

def f1(l):
    for i in range(0,len(l)):
        if l[i]%10 != l[i]:
            del(l[i])
            l.append(l[i]%10)
    return l
Die Funktion kriegt eine Liste und soll immer die letzte Ziffer in die neue Liste einfügen (Modulo 10). Leider komme ich nicht drauf, wo der Fehler in dieser Funktion steckt, es sollte eigentlich das machen, was ich will :? Kann mir jemand einen Tipp geben?
<pädagogik>Eigentlich erst, wenn du die Fehlermeldung mitangibst.</pädagogik>
Das Problem kommt daher, dass Python strict-typed ist.
l[n] gibt die keine Zahl, sondern einen String zurück (grausame variablen- und funktionsnamen, übrigens). Du must das erst per int() zu einer Zahl machen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Oh graus, was ist denn das für ein Code. Du kannst über eine Liste direkt iterieren, da spart man sich die Indexerei und der Code wird sofort einfacher verständlich.
Außerdem sehe ich in de Programm nur eine Liste und die modifizierst du während du drüber iterierst - sowas kann schnell in die Hose gehen. Lass es sein.

Code: Alles auswählen

def f1(l):
    first, last = l[:-1], l[-1]
    if last % 10 != last:
        first.append(last)
    return first
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
pythonguy
User
Beiträge: 28
Registriert: Donnerstag 22. November 2007, 18:51

keppla hat geschrieben:l[n] gibt die keine Zahl, sondern einen String zurück (grausame variablen- und funktionsnamen, übrigens).
Solche Namen bekommen wir als Informatiker jeden Tag vom Prof... :wink:

l ist ja eine Liste mit Pseudozufallszahlen als Int, also:

l=[3,2,4]
>>> isinstance(l[0],int)
True
Oh graus, was ist denn das für ein Code. Du kannst über eine Liste direkt iterieren, da spart man sich die Indexerei und der Code wird sofort einfacher verständlich.
Außerdem sehe ich in de Programm nur eine Liste und die modifizierst du während du drüber iterierst - sowas kann schnell in die Hose gehen. Lass es sein.
Danke für den Tip :-), allerdings suche ich auf den Fehler in dieser kleinen Funktion und eine Fehlermeldung gibt es auch nicht, lediglich die Ausgabe ist falsch und ich würde zugern wissen, was diese Funktion wirklich macht...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

pythonguy hat geschrieben:Danke für den Tip :-), allerdings suche ich auf den Fehler in dieser kleinen Funktion und eine Fehlermeldung gibt es auch nicht, lediglich die Ausgabe ist falsch und ich würde zugern wissen, was diese Funktion wirklich macht...
Naja, indirekt hast du die Frage selbst schon beantwortet - Quatsch. Bei einem solch kurzen Code ist es einfacher und vorteilhafter das neu zu implementieren, als nach seltsamen Fehlern zu fahnden.
Wenn du wissen willst was sie genau macht kannst du mit `pdb` und singlestepping die Funktion debuggen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
pythonguy
User
Beiträge: 28
Registriert: Donnerstag 22. November 2007, 18:51

Na gut, ich habe den Code so modifiziert:

Code: Alles auswählen

def f1(l):
    liste=l[:]
    for i in range(len(l)):
        if liste[i]%10 != liste[i]:
            liste[i]=liste[i]%10
    return liste
Das mit dem Iterieren direkt über eine Liste bekomme ich allerdings nicht hin, da ich

IndexError: list index out of range

bekomme...
BlackJack

Ich sehe nicht wie Du bei *der* Funktion *den* Fehler bekommen kannst.

Der ``if``-Test ist überflüssig. Wenn Du sowieso die Modulo-Rechnung durchführend musst, verschwendet der Test nur Rechenzeit. Einfachste und direkteste Möglichkeit die Funktion zu schreiben:

Code: Alles auswählen

def f1(numbers):
    return [number % 10 for number in numbers]
pythonguy
User
Beiträge: 28
Registriert: Donnerstag 22. November 2007, 18:51

BlackJack hat geschrieben:Ich sehe nicht wie Du bei *der* Funktion *den* Fehler bekommen kannst.

Der ``if``-Test ist überflüssig. Wenn Du sowieso die Modulo-Rechnung durchführend musst, verschwendet der Test nur Rechenzeit. Einfachste und direkteste Möglichkeit die Funktion zu schreiben:

Code: Alles auswählen

def f1(numbers):
    return [number % 10 for number in numbers]
Du hast mich missverstanden: Wenn ich

for i in l:

schreibe, bekomme ich diesen Fehler ...
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ja, das ist kein Wunder. Schau Dir mal das Tutorial zum Thema Listen an. Kurz:

Code: Alles auswählen

>>> l = [1,2,3]
>>> for i in l:
...    print i, l[i]
... 
1 2
2 3
3
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError: list index out of range
>>> l[0]
1
>>> l[1]
2
>>> l[2]
3
Gruß,
Christian

edit: PS Wenn Du demnächst den *vollständigen* Traceback inkl. zugehörigem Code zeigst, vermeidest Du solche Mißverständnisse ;-) .
Antworten