TypeError: unorderable types: int() > str() trotz int()

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.
powaaah
User
Beiträge: 19
Registriert: Samstag 24. Oktober 2015, 12:42

Ich schreibe an einem Fremdsprachenlern-Programm und habe obiges Problem.
"anzahl" ist eine Liste die wiedergeben soll, wie oft ein Wort bereits aufgerufen wurde (damit jedes Wort zunächst einmal aufgerufen wird)
Wenn alle Wörter einmal aufgerufen sind, dann soll es wieder möglich sein, dass alle Wörter aufgerufen werden können. Ansonsten soll die Funktion nochmal aufgerufen werden, bis der richtige Wert erscheint. Mir ist klar, dass es andere Möglichkeiten der Lösung gibt.
Jedenfalls kommt der Fehler beim zweiten Aufruf der Funktion. Der erstmalige Aufruf funktioniert noch tadellos. Beim zweiten Aufruf kommt dann der Fehler in der Zeile: if anzahl_aufrufe < int(max(anzahl)):

Code: Alles auswählen

def deutsch_englisch():                                                
    global zufallswort
    global zufallszahl
    global vocabularies
    zufallszahl = ran.randint(1, len(vocabularies))                   
    zufallswort = vocabularies[zufallszahl]
    anzahl_aufrufe = zufallswort["anzahl_aufrufe"]

    list_count()
    anzahl_aufrufe = int(anzahl_aufrufe)

    if anzahl_aufrufe < int(max(anzahl)):
        neue_anzahl = int(anzahl_aufrufe) + 1
        zufallswort["anzahl_aufrufe"] = neue_anzahl
        pass
    elif anzahl_aufrufe == int(max(anzahl)):
        if anzahl_aufrufe == int(min(anzahl)):
            neue_anzahl = int(anzahl_aufrufe) + 1
            zufallswort["anzahl_aufrufe"] = int(zufallswort["anzahl_aufrufe"]) + 1
            pass
        else:
            deutsch_englisch()
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Woher hast Du 'anzahl':

Code: Alles auswählen

if anzahl_aufrufe < int(max(anzahl)):
Ich sehe nicht, dass es irgendwo definiert wäre.
BlackJack

@powaaah: ``global`` hat in sauberen Programmen nichts zu suchen. Alle Werte, ausser Konstanten, die eine Funktion verwendet sollten die Funktion als Argumente betreten. Sonst ist das semantisch keine Funktion.

Und das `anzahl` eine Liste ist die wiedergeben soll wie oft etwas gemacht wurde klingt mehr als merkwürdig. Das darauf dann ``int(max(anzahl))`` Sinn macht ist ebenfalls sehr fragwürdig. Was sind das denn für Werte in `anzahl`?

Die Fehlermeldung kann an der Stelle eigentlich nicht kommen und die ständigen `int()`-Aufrufe riechen komisch.

Zeig mal Code mit dem man das Problem nachvollziehen kann und einen kompletten Traceback.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@powaaah: Deinen Code möchte ich mir nicht antun, und wahrscheinlich viele andere auch nicht. Funktionsnamen sollten eine Tätigkeit beschreiben, "deutsch_englisch" ist keine, und somit weiß ich beim Lesen gar nicht, was die Funktion eigentlich machen soll. Vergiss, dass es sowas wie global gibt. Variablen betreten eine Funktion über ihre Parameter und verlassen sie wieder als Rückgabewerte. Werden Listeneinträge geändert, sollte man das explizit in den doc-String schreiben.

Datenstrukturen sollten intern immer schon den Datentyp haben, mit dem man arbeiten kann. Wenn Du also Deine Vokabeln aus einer csv-Datei liest, solltest Du Zahlen gleich beim Einlesen in Integerwerte umwandeln, dann mußt Du das nicht bei JEDEM Zugriff tun. Die Verteilung der int-Aufrufe lassen auch nur Deine Verzweiflung beim Herumstochern im Nebel erahnen. So programmiert man nicht.

Die "pass"-Statements sind sinnfrei. Statt "deutsch_englisch" rekursiv aufzurufen willst Du wahrscheinlich eine Schleife benutzen.
powaaah
User
Beiträge: 19
Registriert: Samstag 24. Oktober 2015, 12:42

Ich programmiere erst seit einem Monat und dies ist mein erstes Programm. Für Tipps bin ich immer offen. Wie ich aus einer Funktion an eine andere Funktion eine Variable in Form eines Arguments übergebe weiß ich nicht. Mein Wissen beschränkt sich in dem Gebiet darauf, dass ich in der Ursprungs-Funktion die neue Funktion mit Parameter aufrufen müsste. Wahrscheinlich nutze ich die Funktionen im Moment noch nicht so wie man es sollte oder könnte.

@Sirius3
Das pass war ein überbleibsel als das Feature noch nicht implementiert wurde. Ja, die int() Aufrufe waren ein Stochern im Nebel. Das Programm funktioniert ohne die if-Bedingung wie es soll. Mit if-Bedingung funktioniert es genau einen Durchlauf, nach dem Zweiten dann nicht mehr. Wenn ich den type von max(anzahl) und anzahl_aufrufe im "Leerlauf" (also ohne if-Bedingung) abfrage, dann steht immer 'int' da. Das verwundert mich.
Ob ich eine Schleife aufrufen will? Ja, ich möchte, dass die Funktion erneut ausgeführt wird. Das ist in gewisser Weise eine Schleife. Also neues Wort per Zufall suchen und untersuchen ob es schon einmal aufgerufen wurde. Das ist ja auch das, was die Funktion im Endeffekt tut. Sie sucht ein Wort und schaut ob es schonmal aufgerufen worden ist.

@BlackJack
Die Liste enthält anfangs nur "0"en. Wird ein Wort aufgerufen, dann bekommt es in seiner Zeile "anzahl_aufrufe" + 1 . Nun stehen in der Liste ein Haufen "0"en und eine 1. Ich wusste nicht wie ich es anders hätte umsetzen sollen. In der if-Schleife wird jetzt geschaut ob der aktuelle Datensatz bei "anzahl_aufrufe" < 1 ist, dann wird der Wert + 1 gezählt und ein weiteres Wort wurde damit einmal abgerufen. Usw.

Für die Harten unter euch, hier der Code.

Code: Alles auswählen

import csv
import random as ran
import tkinter as tk

deutsch_auf_englisch = "deutsch"
englisch_auf_deutsch = "englisch"

"""Einlesen der Daten aus der CSV-Liste und umwandeln in eine Liste pro Spalte """
def einlesen():
    global vocabularies
    global FIELDNAMES
    FIELDNAMES = ["englisch", "deutsch", "sprachniveau", "anzahl_aufrufe", "anzahl_ungewusst", "anzahl_ungewusst_aufrufe", "dummy"]     # Einlesen
    with open("englisch.csv") as csvfile:                                                                                               # der
        reader = csv.DictReader(csvfile, delimiter=';', fieldnames=FIELDNAMES)                                                          # benötigten
        vocabularies = list(reader)
    return vocabularies

def schreiben():
    with open("englisch.csv", "w") as csvfile:
        writer = csv.DictWriter(csvfile, delimiter=";", fieldnames=FIELDNAMES)
        writer.writerows(vocabularies)
    return vocabularies

""" Festlegen der GUI """
def raise_frame(frame):
    frame.tkraise()

root = tk.Tk()

Menu_Frame = tk.Frame(root)
Seite2_Frame = tk.Frame(root)
Loesung_Frame = tk.Frame(root)
falsch_Frame = tk.Frame(root)
unbekannt_Frame = tk.Frame(root)

for frame in (Menu_Frame, Seite2_Frame, Loesung_Frame, falsch_Frame, unbekannt_Frame):
    frame.grid(row=0, column=0, sticky="news")

"""Erstellen einer Liste bei der die Anzahl der Aufrufe überprüft werden kann"""
def list_count():
    global anzahl
    anzahl = []
    for reihe_anzahl in vocabularies:
        anzahl_liste = anzahl.append(reihe_anzahl["anzahl_aufrufe"])
    del anzahl[0]
    return anzahl

""" GUI """
def Startseite():                                                       # Das ist das Menü des Programms, die allererste Seite
    raise_frame(Menu_Frame)
    tk.Button(Menu_Frame, width=30, text="Englisch > Deutsch", command=lambda index=englisch_auf_deutsch: ausfuehrung_der_abfrage(index)).grid(row=0, column=0)
    tk.Button(Menu_Frame, width=30, text="Deutsch > Englisch", command=lambda index=deutsch_auf_englisch: ausfuehrung_der_abfrage(index)).grid(row=1, column=0)
    tk.Button(Menu_Frame, width=30, text="Unsichere Wörter", command=unbekannte_woerter).grid(row=2, column=0)
    tk.Button(Menu_Frame, width=30, text="Beenden", command=schreiben).grid(row=3, column=0)

def ausfuehrung_der_abfrage(richtung):                                  # Das ist die Seite die erscheint, wenn man die Sprachauswahl wählt.
    raise_frame(Seite2_Frame)

    if richtung == deutsch_auf_englisch:
        deutsch_englisch()
    else:
        englisch_deutsch()

    tk.Label(Seite2_Frame, width=30, text=zufallswort["deutsch"]).grid(row=1, column=0)
    tk.Button(Seite2_Frame, width=30, text="Lösung", command=lambda index=richtung: Loesung(index)).grid(row=2, column=0)
    tk.Button(Seite2_Frame, width=30, text="Zurück", command=Startseite).grid(row=3, column=0)
    tk.Button(Seite2_Frame, width=30, text="Beenden", command=schreiben).grid(row=4, column=0)

def Loesung(richtung):
    raise_frame(Loesung_Frame)
    uebersetzung(richtung)
    tk.Label(Loesung_Frame, width=30, text=ubersetzt).grid(row=1, column=0)
    tk.Button(Loesung_Frame, width=30, text="Weiter", command=lambda index=richtung: ausfuehrung_der_abfrage(index)).grid(row=2, column=0)
    tk.Button(Loesung_Frame, width=30, text="Nicht gewusst", command=unbekannte_woerter).grid(row=3, column=0)
    tk.Button(Loesung_Frame, width=30, text="Beenden", command=schreiben).grid(row=4, column=0)

def unbekannte_woerter():                                               # Wörter die nicht bekannt sind, in eine extra Datei schreiben um diese gesondert anzeigen lassen zu können
    zufallswort["anzahl_ungewusst_aufrufe"] = 1

    with open("englisch.csv", "w") as csvfile:
        writer = csv.DictWriter(csvfile, delimiter=";", fieldnames=FIELDNAMES)
        writer.writerows(vocabularies)
    return vocabularies

def uebersetzung(richtung):
    global ubersetzt
    if richtung == deutsch_auf_englisch:
        ubersetzt = zufallswort["englisch"]
    else:
        ubersetzt = zufallswort["deutsch"]

def deutsch_englisch():                                                 # Deutsche Wörter anzeigen und auf Englisch übersetzen
    global zufallswort
    global zufallszahl
    global vocabularies
    zufallszahl = ran.randint(1, len(vocabularies))                    # wählt ein zufälliges englisches Wort aus
    zufallswort = vocabularies[zufallszahl]
    anzahl_aufrufe = zufallswort["anzahl_aufrufe"]

    list_count()
    anzahl_aufrufe = anzahl_aufrufe

    if anzahl_aufrufe < max(anzahl):
        neue_anzahl = int(anzahl_aufrufe) + 1
        zufallswort["anzahl_aufrufe"] = neue_anzahl
        
    elif anzahl_aufrufe == max(anzahl):
        if anzahl_aufrufe == min(anzahl):
            neue_anzahl = int(anzahl_aufrufe) + 1
            zufallswort["anzahl_aufrufe"] = int(zufallswort["anzahl_aufrufe"]) + 1
            
        else:
            deutsch_englisch()

if __name__ == '__main__':
    einlesen()
    Startseite()
    root.mainloop()
Traceback (most recent call last):
File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
return self.func(*args)
File "C:\Users\Stefan\Desktop\Sprachprogramm\englisch1.py", line 73, in <lambda>
tk.Button(Loesung_Frame, width=30, text="Weiter", command=lambda index=richtung: ausfuehrung_der_abfrage(index)).grid(row=2, column=0)
File "C:\Users\Stefan\Desktop\Sprachprogramm\englisch1.py", line 60, in ausfuehrung_der_abfrage
deutsch_englisch()
File "C:\Users\Stefan\Desktop\Sprachprogramm\englisch1.py", line 103, in deutsch_englisch
if anzahl_aufrufe < max(anzahl):
TypeError: unorderable types: int() > str()
BlackJack

@powaaah: Wenn Du Funktionen mit Parametern aufrufen kannst, dann weisst Du doch wie man Werte übergibt. Wie gesagt, so wie Du Funktionen benutzt sind das nicht wirklich Funktionen. Man sollte aber echte Funktionen schreiben (können) wenn man etwas umfangreicheres schreibt und umfangreich ist in diesem Fall eigentlich alles was länger als sagen wir mal 40 Zeilen ist, denn alles was mindestens 40 Zeilen hat lässt sich ziemlich sicher sinnvoll auf mehr als eine Funktion verteilen.

Auch das Hauptprogramm sollte in einer Funktion stehen und auf Modulebene nur Definitionen von Konstanten, Funktionen, und Klassen. Dann *muss* man Werte sauber übergeben, denn einfach so magisch aus der ”Umgebung” können sie dann ja nicht mehr kommen.

Du möchtest die Funktion nicht rekursiv aufrufen weil das nicht vorgesehen ist. Das Programm wird dann deswegen irgendwann mit einer Fehlermeldung abbrechen. Rekursive Aufrufe sind in einer Programmiersprache die keine „tail call optimization“ durchführt kein angemessener Ersatz für eine Schleife, denn bei jedem Aufruf wird begrenzter Stapelspeicher verbraucht und dagegen hat Python eine Obergrenze für rekursive Aufrufe bei deren Erreichen das Programm abgebrochen wird. Wenn Du also etwas wiederholen möchtest, verwende ``for`` oder ``while``.

Ganz wichtig: http://if-schleife.de/

Die Liste `anzahl_aufrufe` kann doch dann niemals entwas anderes als Werte von Typ `int` enthalten, also macht der `int`-Aufruf keinen Sinn. Und aus der Beschreibung werde ich nicht wirklich schlau denn was das `max()` dabei zu suchen hat ist mir nicht klar. Ausserdem sollte man zusammengehörige Daten nicht in ”parallelen” Datenstrukturen führen. Das macht den Code am Ende nur komplizierter und fehleranfälliger. Wie oft ein Wort schon dran war sollte in der Datenstruktur gespeichert werden in der das Wort steht. Also bei Dir wohl in dem was an `zufallswort` gebunden wird.

Namen willkürlich abkürzen ist keine gute Idee. `ran` ist irreführend, warum nicht einfach `random`? Dann weiss man das es sich um etwas mit Zufall handelt. Namen sind ja nicht nur dazu da damit der Computer die auseinanderhalten kann, sondern auch damit Menschen die lesen und sie von der Bedeutung her beim Verstehen dess Programms helfen. An der Stelle der Hinweis auf die `random.choice()`-Funktion.

Mit dem ganzen ``global``-Kram hat glaube ich keiner Lust sich auf Fehlersuche zu begeben, denn das ist einfach zu unübersichtlich wo die Werte überall neu gebunden werden könnten. Die GUI solltest Du auch erst einmal weglassen, denn um das sauber hinzubekommen braucht man objektorientierte Programmierung, also der nächste Schritt nach *echten* Funktionen, die diesen Namen auch verdienen.

Den Style Guide for Python Code könntest Du auch berücksichtigen. (Nein, das sind keine optionalen ”Verschönerungen” die man irgendwann hinterher mal machen könnte, da geht es um Konventionen die das lesen und verstehen von Quelltexten erleichern.)

Einfach nur Zeichenketten als Audruck im Programm sind kein Kommentarersatz. Dafür gibt es das '#'-Zeichen. Nur an bestimmten Stellen werden Zeichenketten zu Docstrings und nur dort sollte man sie deshalb zur Dokumentation verwenden.
powaaah
User
Beiträge: 19
Registriert: Samstag 24. Oktober 2015, 12:42

Vielen Dank für die Anregungen.

Wie ich aus einer Funktion einen Wert an eine andere Funktion übergebe weiß ich nicht wirklich. Beispielsweise, wie ich aus der Funktion einlesen() die Liste vocabularies und FIELDNAMES in die Funktion schreiben() reinbekommen soll. Grundgedanke wäre bei der Funktion einlesen() hinzuzufügen, schreiben(vocabularies, FIELDNAMES) und bei der Funktion schreiben(vokabelliste, bezeichnung) hinzuzufügen. Jedoch wird dann jedesmal wenn ich die Funktion einlesen() ausführe auch die Funktion schreiben ausgeführt.

Ich konnte jetzt erstmal bis auf 3 global verringern. FIELDNAME und vocabularies haben mit dem Problem nix zu tun und zufallswort hat mit der if-Anweisung auch nichts zu tun. An den globals sollte es also nicht liegen.

Code: Alles auswählen

def list_count():
    anzahl = []
    for reihe_anzahl in vocabularies:
        anzahl_liste = anzahl.append(reihe_anzahl["anzahl_aufrufe"])
    del anzahl[0]
    return anzahl
Nochwas wie bekomme ich hier die Werte als 'int' direkt eingelesen? Der erste Eintrag ist ein String mit Inhalt "Anzahl der Aufrufe" (Quasi der FIELDNAME) der Rest sind nur Zahlen. Kann man die Schleife irgendwie ab dem zweiten Wert beginnen und direkt als int einlesen?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Du solltest bei der Funktion einlesen anfangen. Wenn Du dort Strings erhältst, wo Anzahl steht, solltest Du die dort gleich in Zahlen umwandeln. Wenn die erste Zeile die Spaltenüberschriften enthält, dann solltest Du sie dort verarbeiten, damit sie erst gar nicht in die Liste vocabularies kommt. FIELDNAMES ist eine Konstante und sollte außerhalb von einlesen definiert werden, vocabularies ist der Rückgabewert der Funktion, braucht also nicht global zu sein.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Ich denke, Du solltest hier sicherstellen, dass nicht eine Zahl als String drin steht:

Code: Alles auswählen

# statt
anzahl_liste = anzahl.append(reihe_anzahl["anzahl_aufrufe"])

# besser
anzahl_liste = anzahl.append(int(reihe_anzahl["anzahl_aufrufe"]))
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: die Liste anzahl_liste ist an sich komplett überflüssig. Wie ich schon geschrieben habe, muß der OP früher ansetzen.
powaaah
User
Beiträge: 19
Registriert: Samstag 24. Oktober 2015, 12:42

Alfons Mittelmeyer hat geschrieben:Ich denke, Du solltest hier sicherstellen, dass nicht eine Zahl als String drin steht:

Code: Alles auswählen

# statt
anzahl_liste = anzahl.append(reihe_anzahl["anzahl_aufrufe"])

# besser
anzahl_liste = anzahl.append(int(reihe_anzahl["anzahl_aufrufe"]))
Hatte ich versucht, wirft aber einen Fehler aus. Vermutlich, weil der erste Zeile ein String (zwei Wörter) ist.

@sirius3
In der Tat wäre es einfacher die Liste gleich korrekt zu vervollständigen. Anfangs hatte ich ja die Werte einfach nur als Liste ausgelesen und wieder eingelesen. Mir wurde dann zu Dictionaries geraten. Dies habe ich übernommen. In der doku habe ich eben mal nachgeschaut und keinen Hinweis entdecken können wie ich bei

Code: Alles auswählen

def einlesen():
    global vocabularies
    FIELDNAMES = ["englisch", "deutsch", "sprachniveau", "anzahl_aufrufe", "anzahl_ungewusst", "anzahl_ungewusst_aufrufe", "dummy"]   
    with open("englisch.csv") as csvfile:                                                                                             
        reader = csv.DictReader(csvfile, delimiter=';', fieldnames=FIELDNAMES)                                                         
        vocabularies = list(reader)
    return vocabularies
    return FIELDNAMES
die Werte als int integriere. Bis auf "englisch" und "deutsch" sind alles nur Zahlen. Es würde mir helfen, wenn man mir sagen könnte wo es steht.
Weiterhin weiß ich nicht wie ich die Liste vocabularies aus der Funktion einlesen für alle anderen Funktionen zur Verfügung stelle ohne "global" zu benutzen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@ powaaah Dann nimm eben die erste Zeile gleich gar nicht erst auf

Code: Alles auswählen

def list_count():
    anzahl = []

    is_data = False
    for reihe_anzahl in vocabularies:
        if is_data:
            anzahl_liste = anzahl.append(int(reihe_anzahl["anzahl_aufrufe"]))
        is_data = True
    return anzahl
Ach anzahl_liste sehe ich da auch. Was soll denn das wieder. Da reicht doch der append.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@powaaah: was denkst Du denn macht ein doppeltes "return"? Die Konstante sollte außerhalb der Funktion definiert werden!

Code: Alles auswählen

FIELDNAMES = ["englisch", "deutsch", "sprachniveau", "anzahl_aufrufe", "anzahl_ungewusst", "anzahl_ungewusst_aufrufe", "dummy"]   

def einlesen():
    with open("englisch.csv") as csvfile:
        reader = csv.DictReader(csvfile, delimiter=';', fieldnames=FIELDNAMES)
        _header = next(reader)
        vocabularies = [{k:int(v) if k.startswith('anzahl_') else v for k,v in row.items()} for row in reader]
    return vocabularies

@Alfons Mittelmeyer: man kann noch so lange an list_count herumdoktorn, es ist und bleibt eine überflüssige Funktion. Außerdem würde man das erste Element per islice ignorieren und nicht per Flag.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Sirius3 ob man ein flag niimmt oder islice, ist mal völlig egal. Doch ein Anfänger sollte nehmen, was er versteht. Und ob die Funktion überflüssig ist oder nicht, wichtig ist, die Fehlerursache zuerkennen und zwar dort, wo der Fehler erkennbar ist und nicht erst bei max(anzahl), wo man nichts mehr erkennen kann. Wo der Fehler entsteht, kann man dann des weiteren durch 'try' 'except ' Aufschlüsse gewinnen. Aber durch das 'int' dort hat man dann eh vielleicht schon den Fehler beseitigt.

Eventuell wird ja beim Schreiben in die Datenbank ein Zahlenwert als String reingeschrieben. Aber soweit habe ich mich jetzt nicht mit dem Programm beschäftigt.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: Du sagst es, man muß die Fehlerursache erkennen, und die liegt nunmal nicht in der Funktion list_count.
BlackJack

@Alfons Mittelmeyer: Flag vs. `islice()` oder vor der Schleife das erste Element mit `next()` abfragen ist nicht egal weil ein Flag eine zusätzliche Variable und damit mehr Komplexität bedeutet. Es ist auch ineffizienter wenn in der Schleife für jedes Element ein Test gemacht wird, welcher nur beim ersten Element wahr ist und bei allen anderen zwar gemacht wird, aber zu keiner Aktion führt. Und das weiss man ja schon vorher, warum also nicht das Wissen nutzen und es vorher einmal abhandeln.

Wenn man nur macht was ein Anfänger ohne weiteres nachlesen versteht, dann kommt der nicht weiter. Auf so etwas wie `islice()` oder `next()` vor der Schleife kommt man als Anfänger in der Regel weil man das woanders mal gesehen hat, also sollte man Anfängern so etwas auch zeigen. Wenn ein Anfänger ausschliesslich das nimmt was er versteht, dann kann er ja gar nicht Programmieren, denn am Anfang versteht er ja gar nichts. Er lernt halt noch.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@BlackJack Wie komplex oder effektiv etwas ist, hängt davon ab, wie es implementiert ist und compiliert wird und läßt sich so nicht ohne Weiteres sagen. Wenn islice das ist:

Code: Alles auswählen

def islice(iterable, *args):
    # islice('ABCDEFG', 2) --> A B
    # islice('ABCDEFG', 2, 4) --> C D
    # islice('ABCDEFG', 2, None) --> C D E F G
    # islice('ABCDEFG', 0, None, 2) --> A C E G
    s = slice(*args)
    it = iter(xrange(s.start or 0, s.stop or sys.maxint, s.step or 1))
    nexti = next(it)
    for i, element in enumerate(iterable):
        if i == nexti:
            yield element
            nexti = next(it)
Quelle: https://docs.python.org/2/library/itert ... ols.islice

dann ist es sehr komplex und gegenüber einem einfachen Flag auch nicht sehr effizient.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: es geht um die Benutzung und die Komplexität des geschriebenen Codes, nicht um die Komplexität der dahinter stehenden Funktionen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Siurius3 Da hast Du recht, in list_count liegt die eigentliche Fehlerursache nicht. Aber dort kann sie erkannt werden, indem man den Typ abfragt und wenn er nicht int ist, den Datensatz ausgibt, und dann kommt man darauf, wie es passiert.

Jetzt habe ich auf etwas geantwortet, was Du anscheinend wieder herausgelöscht hast.

Diskussionen über islice und bessere Strukturierung nützen dem OP wenig. Zuerst sollte es in erster Linie um das Erkennen des Fehlers gehen. Durch islice geht der bestimmt nicht weg.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Ach so, man braucht weder ein Flag noch braucht man islice noch braucht man eine if Abfrage, denn es geht auch so:

Code: Alles auswählen

for reihe_anzahl in vocabularies[1:]:
Antworten