strings in Liste Zahlenwerte aus Dictionairy zuordnen

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.
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

Vorweg will ich erst mal klären, dass ich Programmieranfänger bin und mich mit dem script vielleicht ein bisschen übernommen habe. Nichts desto trotz möchte ich das gerne zuende bringen.

Ich will ein Programm erstellen, welches die einstellige Namenszahl eines eingegebenen Namens ermitteln soll.
Bis jetzt sieht das Programm folgendermaßen aus:

#Zahlenwertzuweisung Buchstaben:
#Erstellen eines Wörterbuchs Variablen (Dictionairy_Variablen):

Dict_Var = {'A':1,'a':1,'Ä':6,'ä':6,'B':2,'b':2,'C':3,'c':3,'D':4,
'd':4,'E':5,'e':5,'F':8,'f':8,'G':3,'g':3,'H':5,'h':5,
'I':1,'i':1,'J':1,'j':1,'K':2,'k':2,'L':3,'l':3,'M':4,
'm':4,'N':5,'n':5,'O':7,'o':7,'P':8,'p':8,'Q':1,'q':1,
'R':2,'r':2,'S':3,'s':3,'T':4,'t':4,'U':6,'u':6,'V':6,
'W':6,'w':6,'X':5,'x':5,'Y':1,'y':1,'Z':7,'z':7,'Ü':2,
'ü':2,'Ö':3,'ö':3}

#Eingabe Namen und Umwandlung in Liste:

print("Willkommen zur Berechnung und Deutung der Namenszahl")

name = input("Name eingeben: ")
print("Der Name lautet " + name)
liste = list(name)
print (liste)

#Den Buchstaben in Liste die variablen Zahlenwerte zuweisen:

for liste in Dict_Var.values():
print("Zahlenliste" + (liste))

---->daraus wird nach Ausführung:

Willkommen zur Berechnung und Deutung der Namenszahl
Name eingeben: Harald
Der Name lautet Harald
['H', 'a', 'r', 'a', 'l', 'd']
Traceback (most recent call last):
File "C:\Users\blah blah\Python\Namenszahl.py", line 24, in <module>
print("Zahlenliste" + (liste))
TypeError: can only concatenate str (not "int") to str

Process finished with exit code 1


Wie ihr sehen könnt erscheint da NICHT:

Willkommen zur Berechnung und Deutung der Namenszahl
Name eingeben: Harald
Der Name lautet Harald
['H', 'a', 'r', 'a', 'l', 'd']
[5,1,2,1,3,4] #(das sind die Werte der Variablen aus dem Dictionairy)

Diese Zahlenliste bräuchte ich, um in einem weiteren Schritt über eine while-schleife so lange Quersummen zu bilden, bis eine einstellige Zahl übrigbleibt, welche dann die gesuchte Namenszahl darstellt.

wie müssen nun also die Befehle aussehen, damit ich zu meiner Liste mit den Variablen komme, um dann weiter machen zu können?

lg,
PanTau
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@PanTau,

da treten gleich mehrere Fehler auf einmal auf:

Code: Alles auswählen

for liste in Dict_Var.values():
    print("Zahlenliste" + (liste))
Vorher weiter oben hattest du in "liste" die Buchstaben des Namens als Liste gespeichet.
Mit dieser For-Schleife überschreibst du die aber wieder.

Und zwar mit der ersten Zahl aus dem Dictionary Dict_Var. Jetzt versuchst du mit

Code: Alles auswählen

print("Zahlenliste" + (liste))
die Zahl 1 an die Zeichenkette "Zahlenliste" anzuhängen. Zahlen und Zeichen vertragen sich nicht so einfach. Daher kommt die Fehlermeldung.

Eine korrigierte Version könnte so ausssehen:

Code: Alles auswählen

Dict_Var = {
    'A':1,'a':1,'Ä':6,'ä':6,'B':2,'b':2,'C':3,'c':3,'D':4,
    'd':4,'E':5,'e':5,'F':8,'f':8,'G':3,'g':3,'H':5,'h':5,
    'I':1,'i':1,'J':1,'j':1,'K':2,'k':2,'L':3,'l':3,'M':4,
    'm':4,'N':5,'n':5,'O':7,'o':7,'P':8,'p':8,'Q':1,'q':1,
    'R':2,'r':2,'S':3,'s':3,'T':4,'t':4,'U':6,'u':6,'V':6,
    'W':6,'w':6,'X':5,'x':5,'Y':1,'y':1,'Z':7,'z':7,'Ü':2,
    'ü':2,'Ö':3,'ö':3
}
# Eingabe Namen und Umwandlung in Liste:

print("Willkommen zur Berechnung und Deutung der Namenszahl")

name = input("Name eingeben: ")
print("Der Name lautet " + name)
liste = list(name)
print(liste)

# Den Buchstaben in Liste die variablen Zahlenwerte zuweisen:

zahlen_liste = []
for buchstabe in liste:
    zahlen_liste.append(Dict_Var[buchstabe])    
print(f"Zahlenliste {zahlen_liste}")

"""
Ausgabe:

Willkommen zur Berechnung und Deutung der Namenszahl
Name eingeben: Harald
Der Name lautet Harald
['H', 'a', 'r', 'a', 'l', 'd']
Zahlenliste [5, 1, 2, 1, 3, 4]
"""
ALso ich hoffe es ist verständlich was und warum ich es geändert habe. Sonst frag nochmal nach.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

`liste` ist ein nichtssagender Name und wird auch gar nicht gebraucht, da man über die Zeichen eines Strings direkt iterieren kann.

Das Dictionary zum Mapping von Buchstaben auf Werte hat auch einen unglücklichen Namen. Zudem macht es wenig Sinn sowohl Werte für Groß- wie auch für Kleinbuchstaben zu definieren wenn diese ohnehin identisch sind. Das regelt man dann bei der Abfrage und dann vergisst man auch nicht so leicht einen Wert wie in diesem Fall (kleines "v").

Ohne list comprehension könnte es dann so aussehen:

Code: Alles auswählen

CHARACTER_MAP = {
    'A': 1, 'Ä': 6, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 8, 'G': 3, 'H': 5,
    'I': 1, 'J': 1, 'K': 2, 'L': 3, 'M': 4, 'N': 5, 'O': 7, 'P': 8, 'Q': 1,
    'R': 2, 'S': 3, 'T': 4, 'U': 6, 'V': 6, 'W': 6, 'X': 5, 'Y': 1, 'Z': 7,
    'Ü': 2, 'Ö': 3}

def main():
    print("Willkommen zur Berechnung und Deutung der Namenszahl")
    name = input("Name eingeben: ")
    print(f"Der Name lautet {name}")

    codes = []
    for character in name:
        if character in CHARACTER_MAP:
            codes.append(CHARACTER_MAP[character.upper()])
    print(codes)

if __name__ == '__main__':
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Meh, und ich ich habe jetzt auf dem anderen von drei Themen mit identischem Inhalt geantwortet. ☹️
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

Meh, und ich ich habe jetzt auf dem anderen von drei Themen mit identischem Inhalt geantwortet. ☹️
sorr -blackjack, ich musste erst mal die Organisation hier checken
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

wer ist Bing[Bot ]?
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Bing? Kennt niemand! Also AltaVista oder Excite aber Bing? Was ist das überhaupt für ein Name? :lol:
Ne, Spaß bei Seite.
Bing ist eine Suchmaschine.

und ein Bot ist ein kleines Programm welches von Bing gestartet wurde um hier mal vorbeizuschauen, sich alles schön durchzulesen, damit dass dann auch in den Suchanfragen von Bing auftauchen kann.
Da aber niemand Bing verwendet, ist das eigentlich nicht nötig.
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

und wo ist mein letzter Beitrag abgeblieben? .... hat den der bot zurückgehalten?
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

Ich möchte euch ja nicht stressen, aber ich würde nur gern wissen gerade, ob mein letzter Beitrag von heute Abend überhaupt angekommen ist, denn ihn zu verfassen hat mich doch auch etwas Konzentration und Zeit gekostet, und er ist noch nicht hier zu sehen
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt keinen Bot, der etwas zurückhält. Nur bei neu-postern gibt es eine erzwungene Freigabe, um Spammer zu unterlaufen.

Wenn dein Post also nicht da ist, dann wird der auch nicht mehr auftauchen. Tut mir leid. Den wirst du neu verfassen müssen.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

/me hat geschrieben: Dienstag 18. Januar 2022, 13:47

Code: Alles auswählen

...
    codes = []
    for character in name:
        if character in CHARACTER_MAP:
            codes.append(CHARACTER_MAP[character.upper()])
...
Da fehlte mir bei der if-Abfrage natürlich der Aufruf von upper. Wenn man diesen Codeblock durch eine list comprehension ersetzt, dann wird es übersichtlicher:

Code: Alles auswählen

    codes = [CHARACTER_MAP.get(character.upper(), 0) for character in name]
Ich habe hier noch ausgenutzt, dass es im Endeffekt um die Quersumme geht und damit eine zusätzliche 0 nichts am Ergebnis ändert. Das ließ sich dann gut mit dem Defaultwert der get-Methode eines Dictionaries verbinden.
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

Ich habe mein Programm soweit fertig, und es funktioniert fast perfekt:

Wertzuweisung_Buchstaben = {
'A':1,'a':1,'Ä':6,'ä':6,'B':2,'b':2,'C':3,'c':3,'D':4,
'd':4,'E':5,'e':5,'F':8,'f':8,'G':3,'g':3,'H':5,'h':5,
'I':1,'i':1,'J':1,'j':1,'K':2,'k':2,'L':3,'l':3,'M':4,
'm':4,'N':5,'n':5,'O':7,'o':7,'P':8,'p':8,'Q':1,'q':1,
'R':2,'r':2,'S':3,'s':3,'T':4,'t':4,'U':6,'u':6,'V':6,
'W':6,'w':6,'X':5,'x':5,'Y':1,'y':1,'Z':7,'z':7,'Ü':2,
'ü':2,'Ö':3,'ö':3,'v':6,' ':0,'-':0
}

print("Willkommen zur Berechnung und Deutung der Namenszahl")

# Umwandlung in Liste:

name = input("Name eingeben: ")

liste = list(name)
print(liste)

# Den Buchstaben in Liste die variablen Zahlenwerte zuweisen:

zahlen_liste = []
for buchstabe in liste:
zahlen_liste.append(Wertzuweisung_Buchstaben[buchstabe])
print(f"Zahlenliste {zahlen_liste}")

import math

#Quersummen ziehen

Quersumme = (zahlen_liste)
summe = 0.0

for ein_wert in Quersumme:
summe = summe + ein_wert

def Namenszahl(summe):
Namenszahl = 0
while summe > 0:
letzteZiffer = summe % 10
Namenszahl = Namenszahl + letzteZiffer
summe = summe // 10
return Namenszahl

print("Die Namenszahl ist:" ,(int(Namenszahl(summe))))


----> bei Ausführung wird daraus:

Willkommen zur Berechnung und Deutung der Namenszahl
Name eingeben: Harald
['H', 'a', 'r', 'a', 'l', 'd']
Zahlenliste [5, 1, 2, 1, 3, 4]
Die Namenszahl ist: 7

Process finished with exit code 0

..... soweit, so gut, aber wenn ich als Namen z.B. den Namen Claudia eingebe ist die Ausgabe fehlerhaft:

Willkommen zur Berechnung und Deutung der Namenszahl
Name eingeben: Claudia
['C', 'l', 'a', 'u', 'd', 'i', 'a']
Zahlenliste [3, 3, 1, 6, 4, 1, 1]
Die Namenszahl ist: 10

Process finished with exit code 0

Wie ihr sehen könnt ist die Zahl 10, was das Programm ja nochmals auf eine einstellige Zahl reduzieren kann, nämlich auf 1.
ich denke, der Fehler liegt irgendwo in dem Block (#Quersummen ziehen), denn bis dorthin läuft ja alles normal. Die while-schleife sollte doch eigentlich weiter Quersummen ziehen gegen 0, bis es einfach nicht mehr geht und auf jeden Fall nur noch eine einstellige Zahl da steht. Tut sie aber nicht und ich weiß nicht warum das so ist.
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

Beim kopieren sind in der obigen Version die Einzüge verlorengegangen.


Wertzuweisung_Buchstaben = {
'A':1,'a':1,'Ä':6,'ä':6,'B':2,'b':2,'C':3,'c':3,'D':4,
'd':4,'E':5,'e':5,'F':8,'f':8,'G':3,'g':3,'H':5,'h':5,
'I':1,'i':1,'J':1,'j':1,'K':2,'k':2,'L':3,'l':3,'M':4,
'm':4,'N':5,'n':5,'O':7,'o':7,'P':8,'p':8,'Q':1,'q':1,
'R':2,'r':2,'S':3,'s':3,'T':4,'t':4,'U':6,'u':6,'V':6,
'W':6,'w':6,'X':5,'x':5,'Y':1,'y':1,'Z':7,'z':7,'Ü':2,
'ü':2,'Ö':3,'ö':3,'v':6,' ':0,'-':0
}

print("Willkommen zur Berechnung und Deutung der Namenszahl")

# Umwandlung in Liste:

name = input("Name eingeben: ")

liste = list(name)
print(liste)

# Den Buchstaben in Liste die variablen Zahlenwerte zuweisen:

zahlen_liste = []
for buchstabe in liste:
zahlen_liste.append(Wertzuweisung_Buchstaben[buchstabe])
print(f"Zahlenliste {zahlen_liste}")

import math

#Quersummen ziehen

Quersumme = (zahlen_liste)
summe = 0.0

for ein_wert in Quersumme:
summe = summe + ein_wert

def Namenszahl(summe):
Namenszahl = 0
while summe > 0:
letzteZiffer = summe % 10
Namenszahl = Namenszahl + letzteZiffer
summe = summe // 10
return Namenszahl

print("Die Namenszahl ist:" ,(int(Namenszahl(summe))))
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

ach schon wieder, sorry
imonbln
User
Beiträge: 149
Registriert: Freitag 3. Dezember 2021, 17:07

Diese Zahlenliste bräuchte ich, um in einem weiteren Schritt über eine while-schleife so lange Quersummen zu bilden, bis eine einstellige Zahl übrigbleibt, welche dann die gesuchte Namenszahl darstellt.

wie müssen nun also die Befehle aussehen, damit ich zu meiner Liste mit den Variablen komme, um dann weiter machen zu können?
divide et impera, mach zwei Funktionen draus, eine welche die Quersumme berechnet und eine zweite die dir den Zahlenwert ausrechnet. Dann kann die Quersumme einfach noch ein zweites Mal darüber gebildet werden.

Generell dein Code liest sich schöner, wenn du ihn als Code hochlädst.
Das import math ist überflüssig. Die Hinweise die dir zum Beispiel /me gegeben hat, sind auch sehr wertvoll, du solltest Sie in deinen Code einbauen.

Code: Alles auswählen

#!/usr/bin/env python3
import typing

def namezahl(name: str) -> typing.List[int]:
     character_map =  {
     'a': 1, 'ä': 6, 'b': 2,
     'c': 3, 'd': 4, 'e': 5,
     'f': 8, 'g': 3, 'h': 5,
     'i': 1, 'j': 1, 'k': 2,
     'l': 3, 'm': 4, 'n': 5,
     'o': 7, 'p': 8, 'q': 1,
     'r': 2, 's': 3, 't': 4,
     'u': 6, 'v': 6, 'w': 6,
     'x': 5, 'y': 1, 'z': 7,
     'ü': 2, 'ö': 3
    }   
    return [character_map.get(char.lower(), 0) for char in name]


def checksum(number: int) -> int:
    result = 0 
    while number:
        number, remain = divmod(number, 10) 
        result += remain
    if result > 9:
        result = checksum(result)
    return result


def main():
    print("Willkommen zur Berechnung und Deutung der Namenszahl")
    name = input("bitte den Namen eingeben: ")
    numbers = namezahl(name)
    namenumber = checksum(sum(numbers))
    print(f"Die Namenszahl ist: {namenumber}" 

if __name__ == '__main__':
    main()
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

Imonbin, dein Programm gibt mir folgende Fehlermeldung:

line 17

return ([character_map.get(char.lower(), 0) for char in name])
^
IndentationError: unindent does not match any outer indentation level
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

und deuten tut das Zeichen eigentlich auf einen anderen Ort, nämlich auf direkt hinter ..... in name]
^
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@PanTau,

Zeile 17 wird zwar angezeigt, aber der Fehler wird von Python nicht richtig erkannt. Eigentlich ist Zeile 5 nur um ein Zeichen nach rechts gerutscht.
Wenn du die Einrückung von Zeile 5 um 1 Zeichen verringerst, sollte es passen.

Zeile 35 hat auch ein Problem:
Da ist die Klammer der print-Funktion nicht geschlossen.

Das Programm funktioniert dann zwar, ich würde aber auch noch einen Alternativvorschlag machen:

Code: Alles auswählen

def namezahl(name):
    character_map =  {
        'a': 1, 'ä': 6, 'b': 2,
        'c': 3, 'd': 4, 'e': 5,
        'f': 8, 'g': 3, 'h': 5,
        'i': 1, 'j': 1, 'k': 2,
        'l': 3, 'm': 4, 'n': 5,
        'o': 7, 'p': 8, 'q': 1,
        'r': 2, 's': 3, 't': 4,
        'u': 6, 'v': 6, 'w': 6,
        'x': 5, 'y': 1, 'z': 7,
        'ü': 2, 'ö': 3
    }   
    return [character_map.get(char.lower(), 0) for char in name]


def crosssum(numbers):
    while len(numbers) > 1:
        numbers = list(map(int, str(sum(numbers))))
    return sum(numbers)


def main():
    print("Willkommen zur Berechnung und Deutung der Namenszahl")
    name = input("bitte den Namen eingeben: ")
    numbers = namezahl(name)
    namenumber = crosssum(numbers)
    print(f"Die Namenszahl ist: {namenumber}")


if __name__ == "__main__":
    main()
Die Funktion crosssum berechnet aus der Liste aller Buchstabenzahlen die Quersumme bis diese einstellig ist.

Erklärung zu der Zeile in der while-Schleife:
number ist eine Liste von Zahlen
sum() bildet die Summe aller Zahlen in dieser Liste
str() konvert diese Summenzahl in eine Zeichenkette aus Ziffern
map(int, ...) nimmt jede Ziffer aus der Zeichenkette und konvert sie einzeln in Zahlen
list() macht daraus schließlich eine Liste von Zahlen
Die While-Schleife wird erst abgebrochen wenn diese Liste aus nur einem Element besteht
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

Ich danke dir rogerb, das sieht alles gut aus. Ich kann es leider noch nicht laufen lassen. Es gibt mir folgende Fehlermeldung:

File "C:\Users\Heiko\Desktop\Python\Namenszahl2.py", line 11
return [character_map.get(char.lower(), 0) for char in name]
IndentationError: unexpected indent
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann hast du einen Fehler beim Copy&Paste gemacht. Denn bei mir geht das Programm problemlos.
Antworten