Python "Unendliches Alphabet"?

4 Antworten

Vom Fragesteller 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

0

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 
Fragesteller
 17.10.2021, 04:02

Danke, Ja mein Ziel ist ein zyklisches Alphabet. Hatte den Begriff vergessen. Danke

0

Aa ab acht ad ae af usw... da kommst du auf sehr viel mehr als 200

cxl06 
Fragesteller
 17.10.2021, 03:51

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

Und das auch mit zahlen wie 653837540975467.

0