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.
SpyHRO65
User
Beiträge: 8 Registriert: Montag 22. April 2013, 15:59
Freitag 3. Mai 2013, 13:19
Moin Moin,
Ich soll für die Uni ein Programm schreiben, welches überprüft ob die Eingabe eine zulässige kanadische plz darstellt. Die PLZ sehen so aus:
A0B 1C2
D3E 4F5
USW.
Ich weiß jetzt nicht genau wie ich Python zu sagen habe, dass er nur Buchstaben bzw Zahlen für die jeweilige Stelle der PLZ als Eingabe zulassen soll.
Wäre Super, wenn mir da jemand auf die Sprünge helfen könnte
mcdwerner
User
Beiträge: 113 Registriert: Donnerstag 7. Juli 2011, 14:27
krisjugisto
User
Beiträge: 4 Registriert: Freitag 26. April 2013, 09:50
Freitag 3. Mai 2013, 14:06
Mach es, wie mcdwerner schon vorschlug, mit regulären Ausdrücken. Aus dem Stand würde ich sagen, du müsstest einfach mal prüfen, ob dieser Ausdruck
Treffer ausspuckt.
Sirius3
User
Beiträge: 18335 Registriert: Sonntag 21. Oktober 2012, 17:20
Freitag 3. Mai 2013, 14:40
@krisjugisto: Der reguläre Ausdruck ist natürlich noch zu allgemein.
@SpyHRO65: Aufgaben fallen normalerweise nicht so vom Himmel. Wahrscheinlich hast Du in Deinen Unterlagen schon die nötigen Konstrukte stehen (String-Indizierung, If-Abfragen, usw.).
Was hast Du schon probiert?
/me
User
Beiträge: 3561 Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn
Freitag 3. Mai 2013, 14:50
Sirius3 hat geschrieben: @SpyHRO65: Aufgaben fallen normalerweise nicht so vom Himmel. Wahrscheinlich hast Du in Deinen Unterlagen schon die nötigen Konstrukte stehen (String-Indizierung, If-Abfragen, usw.).
Was hast Du schon probiert?
Es kann gut sein, dass das bisherige Wissen so aussieht, dass die Uni keinen regulären Ausdruck sondern etwas simpleres haben will.
Daher ist die Frage "Was hast du probiert?" (plus die Frage "Welche Python-Sprachelemente darfst du verwenden?") entscheidend.
BlackJack
Freitag 3. Mai 2013, 17:33
Code: Alles auswählen
from functools import partial
from itertools import izip
from operator import contains, eq as equals
from string import digits, uppercase
is_decimal_digit = partial(contains, set(digits))
is_postal_code_letter = partial(contains, set(uppercase) - set('DFIOQU'))
is_space = partial(equals, ' ')
def is_postal_code(code):
checks = {
'A': is_postal_code_letter,
'0': is_decimal_digit,
' ': is_space,
}
return (
len(code) == 7 and all(checks[p](c) for p, c in izip('A0A 0A0', code))
)
Sirius3
User
Beiträge: 18335 Registriert: Sonntag 21. Oktober 2012, 17:20
Freitag 3. Mai 2013, 18:15
@BlackJack: die magic number 7 ist schlecht,
besser:
Code: Alles auswählen
from functools import partial
from itertools import izip_longest
from operator import contains
from string import digits, uppercase, whitespace
POSTAL_CODE_CHECKS = {
'0': partial(contains, set(digits)),
'A': partial(contains, set(uppercase) - set('DFIOQU')),
' ': partial(contains, set(whitespace)),
}
def is_postal_code(code):
return all(POSTAL_CODE_CHECKS[p](c) for p, c in izip_longest('A0A 0A0', code, fillvalue=' '))
BlackJack
Freitag 3. Mai 2013, 18:28
@Sirius3: Ich wollte dem OP halt nicht gleich die perfekte Lösung liefern.
Edit: Wobei `string.whitespace` auch Tabs und Zeilenumbruch/-ende enthält. Da würde ich bei ' ' bleiben.