Python "Unendliches Alphabet"?
Man hat eine Zahl{x}. Jetzt will ich vom Buchstaben D, {x} Buchstaben nach vorne, sobald es bei Z ankommt ist die Liste zu Ende und es geht nicht mit A weiter, wie es sein sollte.
Wie mache ich das so was wie eine Liste weitergeht, sodass ich den 200. Buchstabe vom Alphabet nutzen kann?
4 Antworten
def get_char(i, alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"):
return(alphabet[i % len(alphabet)])
Dann ist...
get_char(0) = "A"
get_char(1) = "B"
get_char(2) = "C"
...
get_char(24) = "Y"
get_char(25) = "Z"
get_char(26) = "A"
get_char(27) = "B"
get_char(28) = "C"
....
Erläuterung:
Mit len(alphabet) erhält man die Länge des alphabets, hier also: 26
Mit i % 26 erhält man den Rest bei einer Division von i durch 26.
D.h. für eine ganze Zahl i wird die Zahl r ∈ {0, 1, 2, ..., 25} gefunden, sodass i = q ⋅ 26 + r mit einer ganzen Zahl q ist.
Im Grunde kann man das grob so sehen, dass bei i % 26 so oft 26 addiert oder subtrahiert wird, bis man im Bereich {0, 1, 2, ..., 25} landet. Wenn man mit i also von 25 aus weiterzählt, fängt man bei 26 wieder mit 0 an. Man erhält als weiter 26 % 26 = 0 und 27 % 26 = 1 und 28 % 26 = 2 und so weiter. Also im Grunde bewirkt das hier eine zyklische Wiederholung von 0, 1, 2, ..., 25, was man hier gebrauchen kann.
============
Wenn du nun von einem gewissen Zeichen des Alphabets x Stellen weiterzählen möchtest, würde ich das spontan so lösen...
ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def get_char(i, alphabet = ALPHABET):
"""Gibt das i-te Zeichen in einem zyklisch
erweiterten Alphabet zurück."""
return(alphabet[i % len(alphabet)])
def get_further_char(c, x, alphabet = ALPHABET):
"""Zählt in einem zyklisch erweiterten Alphabet
vom Zeichen c aus x Stellen weiter und gibt das
entsprechende Zeichen zurück."""
index_c = alphabet.index(c)
return(get_char(index_c + x, alphabet))
Dann ist beispielsweise...
get_further_char("D", -1) = "C"
get_further_char("D", 0) = "D"
get_further_char("D", 1) = "E"
get_further_char("D", 2) = "F"
get_further_char("D", 3) = "G"
...
get_further_char("D", 21) = "Y"
get_further_char("D", 22) = "Z"
get_further_char("D", 23) = "A"
get_further_char("D", 24) = "B"
get_further_char("D", 25) = "C"
...
Hey,
dafür eignet sich super gut der Modulo Operator (%). Dieser gibt den Rest-Wert einer Division zurück, hier ein kurzes Beispiel: 15 % 10 = 1 Rest 5.
Hier ist jetzt mein Code-Ansatz, welchen du nutzen könntest:
alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
def getCharByIndex(i):
i = i % len(alphabet)
return alphabet[i]
print(getCharByIndex(26))
Bedenke bitte, dass der Zugriff auf ein Array über den Index geschieht, welcher bei 0 anfängt zu zählen, alphabet[0] ist also A und alphabet[25] ist Z.
Erhälst du nun bspw. die Zahl 26, rechnest du "26 % die Länge vom Array (also 26)". Somit erhälst du als "26 % 26 = 0" (da 26 / 26 keinen Rest hat). 0 returnt dir aus dem Array wie zu erwarten ist dann auch das "A".
Bei der Zahl 27 wären es 27 % 26 = 1 Rest 1, was dir "B" returnt.
Diese Methode funktioniert somit bei jeder Zahl.
Mfg Jannick (L1nd)
Okay Danke für die Anmerkung, ich arbeite nicht wirklich oft mit Python
Deine Erklärung ist irgendwie komisch, wo sollen denn die unendlich vielen Buchstaben herkommen, so ganz allgemein?
Oder willst Du ein zyklisches Alphabet?
Dann würde man das etwas so machen: newpos=(pos+shift) % alphabet_size
Du formst also aus den Indices der Bustaben einen Restklassenring.
Danke, Ja mein Ziel ist ein zyklisches Alphabet. Hatte den Begriff vergessen. Danke
Aa ab acht ad ae af usw... da kommst du auf sehr viel mehr als 200
Es sollte wenn es bei Z ist mit A weitergehen usw.
Und das auch mit zahlen wie 653837540975467.
Völlig richtig. alphabet kann man auch einfach als einzelnen String hinschreiben, wenn man faul ist