Filterfunktion für eine Liste

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • 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

    es grüßt 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

  • 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

    es grüßt euer
    Willy

  • Beitrag von Dennis89 (13. Mai 2022 um 21:10)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Hallo,

    du könntest eine weitere Liste zum vergleichen missbrauchen.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • 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.

    Einmal editiert, zuletzt von RestlessMud46765 (14. Mai 2022 um 00:00) aus folgendem Grund: überarbeitet

  • Richtig :D

    Habe meine Antwort ergänzt, nachdem ich das hier gelesen habe.

  • 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

    es grüßt 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

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • 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

    es grüßt 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

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • 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

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • 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

    es grüßt 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

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Guten Tag __blackjack__

    oder was wollen sie in meiner schon geschlossenen Fragerunde ?

    Haben Sie ein EGO Problem, weil sie mir wiederhohlt als Poster auf meine Posts genannt wurden ?

    Ich sage dir eins: Wenn du nichts anderes im Nischl hast als dich fünfeinhalb Monate später hier einzumischen, dann hast du einen an der Waffel !

    Du glaubst doch nicht ernsthaft das ich jetzt wegen einer offen gebliebenen Lösung und wegen eines Softwarepaketes jetzt noch einmal irgendwelche Experimente starte, nur um deinen tollen Beitrag zur Anwendung zu bringen ?

    Junge, wenn du nach einigen Tiefschlafphasen nichts anderes im Sinn hast versuche es mal mit "real live"

    es grüßt euer
    Willy

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!