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.
Werte aus dictionary in if-Abfrage übernehmen
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:
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)
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?
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?
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?
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?
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.
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.
- __blackjack__
- User
- Beiträge: 14065
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Ungetesteter Code:
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.
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()
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
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.
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.
- __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