Werte aus dictionary in if-Abfrage übernehmen

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
spaulik
User
Beiträge: 4
Registriert: Sonntag 15. Januar 2023, 10:55

Hallo,
ich bin ein Python-Anfänger und beschäftige mich (bisher erfolglos) mit folgendem Problem:
Ich habe eine Liste von Wörtern und möchte überprüfen, ob gewisse Buchstaben an bestimmten Positionen vorkommen oder nicht vorkommen.
Bisher habe ich beispielhaft folgende if-Abfrage verwendet:

if word[1] == "u" and word[3] == "k" and word[4] == "t":
if word[0] != "u" and word[1] != "n" and word[2] != "f" and word[3] not in ("e","r","s"):
print(word)

Damit ich nicht jedes Mal im Code die Werte ändern muss, frage ich die Werte ab und speichere sie in einem DIctionary.

Bsp: drin_pos: ['1': 'u', '3': 'k', '4': 't']
bzw. nicht_pos: ['0': 'u', '1': 'n', '2': 'f', '3': 'e', '3': r'', '3': 's']

WIe kann ich nun die Werte (key und value) aus dem Dictionary in die jeweilige if-Abfrage übernehmen (abhängig von der Anzahl der eingegebenen Werte)?

Vielleicht kann mir hier jemand weiter helfen?
Vielen Dank schon mal im Voraus.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Wörterbücher schreibt man mit geschweiften Klammern, nicht mit eckigen. Dann darf man aber für jeden Key nur einen Wert haben, dreimal 3 darf es nicht geben.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 3 und mal 8. Die Zahlen sollten auch Zahlen sein, und keine Strings.
Wenn man was für mehrere Dinge machen möchte, benutzt man Schleifen. Am besten in einer eigenen Funktion, die kann man dann frühzeitig per return mit True oder False verlassen.
Die Bedingungen sind irgendwie redundand. Wenn an zweiter Stelle ein u stehen muß, dass ist das immer kein n und wenn an vierter Stelle ein t steht, dann ist das kein e, kein r und kein s.
Lesbarer finde ich hier einen regulären Ausdruck:

Code: Alles auswählen

if re.match("[^u]u[^f]kt", word):
    print(word)
spaulik
User
Beiträge: 4
Registriert: Sonntag 15. Januar 2023, 10:55

Hallo Sirius3,
die Beispiele waren schlecht von mir ausgewählt. Tut mir Leid.
Das mit dem regulären Ausdruck probiere ich aus (muss mich nur noch einlesen).
Habe ich das richtig verstanden, dass ein Dictionary immer nur ein eindeutiges "key - value" Paar enthalten kann?
Wie würde denn dann eine Abfrage aussehen, welche eine bestimmte Position (Bsp.: word[3]) auf mehrere nicht vorhandenen Buchstaben überprüft?
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Lösung nutzt Du doch schon selbst, mit `in` und `not in` vergleichst Du mehrere Buchstaben.
spaulik
User
Beiträge: 4
Registriert: Sonntag 15. Januar 2023, 10:55

Ja, die if-Abfragen funktionieren.
Nur wollte ich wissen, wie ich es hinbekomme, die Positionen und Werte (Buchstaben) aus einem DIctionary zu übernehmen.
Ich erstelle die Ditionarys über Tastatureingabe des Benutzers.

while True:
pos_0 = input('die Position, welche einen Buchstaben nicht enthält, eingeben (Abbruch mit #): ')
letter = input('den dazugehörigen Buchstaben eingeben (Abbruch mit #): ')
if len(letter) < 1:
break
else:
nicht_pos[pos_0] = letter

Diese Werte werden nun im Dictionary "drin_pos" gespeichert (welches ich vorher definiert habe: drin_pos = {}).
Nun möchte ich die eingegebenen Werte in die if-Abfrage übernehmen.
Also statt word[1] den ersten key und "u" den dazugehörigen Wert.
Evtl. if word[int(key)] == value: ?
Nur noch mit einer Schleife.
Und da hänge ich.
Ich hoffe, ich konnte es einigermaßen erklären?
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie schon geschrieben, wird mit 4 Leerzeichen pro Ebene eingerückt. Die Einrückung von else führt dann sogar zu einem IndentationError.
Was soll die 0 and der Variable `pos_0`? Variablennamen sollten aussagekräftig sein und nicht zum Rätseln einladen.
Der Prompt beim Input stimmt nicht, weder bei pos_0 noch bei Letter kann man durch die Eingabe von # abbrechen.
Du mußt halt die Eingabe in eine Form bringen, die Du einfach weiterverarbeiten kannst, oder die Verarbeitung an die Eingabe anpassen.
Wie schon geschrieben, sollte die Position auf jedenfall in eine Zahl umgewandelt werden. Dann kannst Du entweder eine Liste verwenden, wo es kein Problem ist, Positions-Buchstabenpaare auch mehrfach zu speichern, oder Du mußt eben in einem Wörterbuch alle Buchstaben zu einer Position in einer passenden Datenstruktur sammeln.

Am besten ist es, erst die ideale Datenhaltung für die Weiterverarbeitung zu finden, und dann die Eingabe entsprechend anpassen.
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ungetesteter Code:

Code: Alles auswählen

#!/usr/bin/env python3


def check(filters, text):
    for predicate, items in zip(
        [
            lambda character, characters: character in characters,
            lambda character, characters: character not in characters,
        ],
        filters,
    ):
        for index, characters in sorted(items):
            try:
                character = text[index]
            except IndexError:
                break
                
            if predicate(character, characters):
                return False
    
    return True


def main():
    filters = (
        [(1, ["u"]), (3, ["k"]), (4, ["t"])],
        [(0, ["u"]), (1, ["n"]), (2, ["f"]), (3, ["e", "r", "s"])],
    )
    print(check(filters, "some_word"))


if __name__ == "__main__":
    main()
Wobei `filters` natürlich nichts ist was der Endnutzer eingeben möchte. Eigentlich nicht mal ein Programmierer. Da würde man sich eine kompaktere Form ausdenken. Vielleicht so etwas wie "+1u +3k +4t -0u -1n -2f -3ers", also + oder -, gefolgt von einem Index, gefolgt von den Zeichen die an dem Index (nicht) stehen sollen/dürfen.

Das kann man dann in entsprechende Datenstrukturen parsen oder einen regulären Ausdruck daraus basteln.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
spaulik
User
Beiträge: 4
Registriert: Sonntag 15. Januar 2023, 10:55

Ok, ich versuch's.
Danke für die Hinweise (ich bin wie gesagt kein Profi. Ich wollte als Rentner meine grauen Gehirnzellen noch etwas fit halten und versuche mir Python mehr oder weniger gut online anzueignen).
Daher bitte ich um Milde und Nachsicht für meine Fragen.
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Es ist übrigens gut möglich das mein Code nicht sinnvoll mit Worten umgeht die kürzer als der grösste Index in den Filtern ist. Da ist mir auch nicht ganz klar wie sich das dann verhalten soll. Bei Deinem Ausgangsbeitrag würde das in einem `IndexError` enden.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten