Python "Unendliches Alphabet"?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet
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)

Woher ich das weiß:eigene Erfahrung

wunschname0302  17.10.2021, 10:42

Völlig richtig. alphabet kann man auch einfach als einzelnen String hinschreiben, wenn man faul ist

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.


cxl06 
Beitragsersteller
 17.10.2021, 04:02

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


cxl06 
Beitragsersteller
 17.10.2021, 03:51

Es sollte wenn es bei Z ist mit A weitergehen usw.

Und das auch mit zahlen wie 653837540975467.