Filterfunktion für eine Liste

  • Guten Abend,

    ich habe gerade ein kleines Problem, wofür ich gerade keinen Lösungsansatz finde.


    ich möchte eine Liste mit Statuswerten abfragen.


    Code
    def status(table, val_min, val_max):

    die LIST in der Variablen table enthält nur positive und negative Ganzzahlen. Eine Prüfung diesbezüglich ist nicht notwendig.
    Negative Zahlen sollen komplett ignoriert werden. Alle positiven Zahlen müssen in dem Bereich zwischen val_min' und val_max liegen und dürfen nur einmal in table enthalten sein. Wenn diese Bedingung erfüllt ist soll der Wert True , andernfalls False zurückgegeben werden.

    Ich hoffe mir kann hier jemand einen Gedankenanstoß geben.

    Danke im voraus,


    euer Willy

  • Hallo,


    Gegenfrage: hast hast du denn schon probiert? Zeig' mal deinen Code. Der einfachste Weg ist, dass du über `table`iterierst, dabei auf positiv / negativ prüfst, wenn positiv die Grenzen prüfst und dann noch die Häufigkeit zählst. Also Schritt für Schritt. Das kann man dann noch beliebig elegant ausgestalten, aber für den Anfang und gerade dann, wenn man keine richtigen Ansatz hat, ist Schritt für Schritt ein guter Start.


    Gruß, noisefloor

  • hyle

    Changed the title of the thread from “Filterfunktion für ein LIST” to “Filterfunktion für eine Liste”.
  • Guten Abend,


    Code
    def status(table, val_min, val_max):
        temp = []
        for tab_val in table:
            if val_min < tab_val < val_max:
                temp.append(tab_val)

    bis zu dem Punkt bin ich schon. nun fehlt mir der Ansatz wie ich die Prüfung auf einmaliges Vorkommen jeder Zahl durchführe.

    euer
    Willy

  • Post by Dennis89 ().

    This post was deleted by the author themselves: War Quatsch ().
  • Hallo,


    du könntest eine weitere Liste zum vergleichen missbrauchen.



    Grüße

    Dennis

    “If you’re not paying for the product, then you are the product” Daniel Hövermann

  • Edit: Aufgabe missverstanden. Die Antwort bezieht sich darauf, wie man Zahlen zwischen min und max limitiert.


    Es gibt keine min_max-Funktion in Python, aber man kann min und max kombinieren.

    Das mit den negativen Zahlen kannst du komplett ignorieren, solange der Wert für val_min positiv oder == 0 ist.


    Das ist eine Zeile Code.


    • minimum von val und max_val
    • maximum von vorherigem Wert und min_val


    Negative Zahlen könnten mit dem Trick auch ausgeschlossen werden, in dem man noch einen Schritt hinzufügt:

    • maximum von vorherigem Wert und 0

    Auflösung:

    Code
    def limit(value, val_min, val_max):
        return max(min(value, val_max), val_min)

    ----------------------



    Hier nun die eigentliche Aufgabe (mit set).


    Im Grunde ist es wie mit any und all. Bei der Funktion any muss nur ein Wert True sein, was dann zum vorzeitigen Abbruch führt und ein True zurückgibt. Für ein False muss any alle Elemente durchgehen. Die Funktion all bricht ab, sobald ein Element False ist. Die Funktion muss aber alle Elemente prüfen, um ein True zurückliefern zu können. Das gleiche gilt für logische Verknüpfungen.

    Edited once, last by DeaD_EyE: überarbeitet ().

  • Guten Morgen Morgen,

    Danke, besonders an Dennis89 :danke_ATDE:

    Sehr viel Verwirrung. Mir ist dabei aufgefallen, dass selbst mein erster Ansatz noch einen logischen Fehler enthielt, den ich anhand des Code-Beispiels noch erkannt, und behoben habe.


    Meine Funktion schaut nun wie folgt aus, und erfüllt genau den gewünschten Zweck:


    Weiter geht es im Programmtext, bis mir die Augen zufallen ;)

    euer
    Willy

  • Hallo,


    zu deinem Code, es ist nicht unbedingt üblich eine Funktion in einer Funktion zu erstellen.

    Üblicherweise werden Funktionen aus der Hauptfunktion 'main' aufgerufen. Dort werden Argumente übergeben und Rückgaben entgegen genommen.


    Achte darauf, das du den Code so übersichtlich wie möglich hälst und deine Funktionen nicht zu viel auf einmal machen. Am besten macht eine Funktion eine Tätigkeit und nach der ist sie am besten auch noch benannt. Das habe ich im Beispiel auch nur bedingt eingehalten.


    Das alles ist übrigends noch etwas eleganter möglich, wenn man more_itertools verwendet:




    Grüße

    Dennis

    “If you’re not paying for the product, then you are the product” Daniel Hövermann

  • Guten Morgen Dennis89,

    ich will jetzt nicht meckern, weil es mir überhaupt nicht zusteht.
    dennoch habe ich gleich mal versucht dein Codebeispiel auszuführen.
    Geht bei mir nicht :conf:



    Ich will dir jetzt keinen Codefehler unterstellen, aber an dieser Stelle bin ich wieder am Ende mit meinem Latein.

    euer
    Willy

  • Hallo,


    du darfst meckern soviel du willst 👍🏼

    Vielleicht hast du eine alte Version von „itertools“ , da die Methode unter „neu“ aufgelistet wurde.


    Vielleicht musst du das mal neu installieren.


    Grüße

    Dennis

    “If you’re not paying for the product, then you are the product” Daniel Hövermann

  • Hallo,


    ich habe gerade auch mit Python 3.7 und Thonny, also gleich wie bei dir, meinen Code laufen lassen. Davor musste ich pip3 install more-itertools im Terminal eingeben. Ohne sudo, wir wollen das Modul für den User installieren und nicht für 'root'.


    Ich wollte damit jetzt eigentlich keine Verwirrung stiften.


    Grüße

    Dennis

    “If you’re not paying for the product, then you are the product” Daniel Hövermann

  • Guten Tag Dennis89,

    irgendwie müssen hier binäre Geister unterwegs sein. :gk1:
    Ich habe nun die Installation mit sudo pip uninstall more-itertools wieder rückgängig gemacht.
    Dann das System neu gestartet, und den gleichen Befehl eingeben wie du ihn mit pip3 aufgeführt hast.

    Hier kommt nun die Meldung :

    Bash
    Defaulting to user installation because normal site-packages is not writeable
    Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
    Requirement already satisfied: more-itertools in /usr/lib/python3/dist-packages (4.2.0)

    Du hast doch gesagt, daß man kein sudo davor schreiben darf. Die gleiche Meldung hatte ich heute früh auch schon mit pip erhalten, aber mit sudo wurde dann die more-itertools-5.0.0 Version installiert.

    Was nun ? Guter Rat ist wohl teuern :helpnew:
    Ohne SUDO klappt es nicht weder mit pip, noch mit pip3 ! Mit SUDO klappt zwar die Installation, aber steht dann nicht für den User zur Verfügung.

    euer

    Willy

  • Also für 'all_unique' brauchst du die Version >= 8.6 von 'more-itertools'.


    Das ist jetzt auch nicht unbedingt mein Fachgebiet. Vielleicht hilft es, wenn du 'more-itertools' nochmal ganz löscht und frisch installierst.


    Code
    python3 -m pip uninstall -r more-itertools

    und danach

    Code
    python3 -m pip install more-itertools


    Wenn das nicht hilft, dann musst du warten bis sich einer meldet, der sich damit wesentlich besser auskennt.


    Viel Erfolg

    Dennis

    “If you’re not paying for the product, then you are the product” Daniel Hövermann