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

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: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann hast du einen Fehler beim Copy&Paste gemacht. Denn bei mir geht das Programm problemlos.
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

_deets_, ich habe das dictionairy von mir gelassen, wie es war und den Rest einfach unten rangehängt. und es sieht bei mir in pycharm genau so aus wie bei rogerb seinem code. Natürlich habe ich es nur reinkopiert. Was kann ich da falsch machen?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du irgendwelche Sachen irgendwie einkopierst, dann natuerlich alles.

Rogers Code einfach als ganzes kopieren, und nichts anderes benutzen, dann geht es.
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

Ah moment, ja klar muss ich die Einleitung des Dictionairy auch mit rüber nehmen, weil das Programm sich ja in der Folge auf auf diese charaktermap bezieht .... sorry
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

Bingo .... es funktioniert jetzt auch bei mir mit meinem eigenen dictionairy ..... super!!
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

ich küsse euch (nat. nur elektronisch ;D)
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

wenn ihr mir jetzt noch sagen könntet, wo steht, wie man so ein Programm als ausführbare Datei an ein Handy senden kann, dann wäre ich glücklich. Ich mache das alles nämlich, weil es meiner Tochter bei der Namensfindung für ihr ungeborenes Baby helfen soll. Ich muss jetzt nur noch die Deutung für die verschiedenen Zahlen ranhängen:

if {namenumber} == 1
print(".............") <---- so oder ähnlich

Aber meine Tochter kann das Programm nat. nicht auf meinem PC gebrauchen. Sie sollte es für ihr Handy haben. Danach werde ich mein Augenmerk wieder den Lernprogrammen zuwenden. Die sind erfolgversprechender für mich als Programmier-Rookie.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn deine Tochter ein iPhone hat, dann geht das mit Pythonista.
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

ok, danke .... da werde ich mich dann schlau machen, thx
imonbln
User
Beiträge: 149
Registriert: Freitag 3. Dezember 2021, 17:07

rogerb hat geschrieben: Freitag 21. Januar 2022, 22:49

Code: Alles auswählen

def crosssum(numbers):
    while len(numbers) > 1:
        numbers = list(map(int, str(sum(numbers))))
    return sum(numbers)
Die Funktion crosssum berechnet aus der Liste aller Buchstabenzahlen die Quersumme bis diese einstellig ist.
Wow! Schönes kleines Kuriosum.
Auf der einen Seite ist dieser Code, ein sehr ästhetischer Umgang mit der Programmiersprache Python, um das Problem zu lösen. Anderseits ist das ständige Umwandeln von String nach Integer und wieder zurück etwas, das den erfahrenden Systemingenieur in mir sofort zucken lässt, da ich weiß, dass beide Operationen vergleichsweise teuer sind.
Ich denke, dass diese Lösung etwas mehr Systemlast erzeugen wird als die reine Integer Implementierung, wie ich sie vorgeschlagen habe und würde sie wahrscheinlich in einem Codereview beanstanden.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@imonbln, Danke! Wertvolles Feedback! Genau der Punkt hatte mich auch erst zögern lassen und ich hatte insgeheim damit gerechnet etwas in der Art zurückzubekommen. Ich werde bei Gelegenheit mal die Perfomance prüfen. Wenn man mal "crosssum python" googelt, findet man den Ansatz übrigens recht oft.

Man könnte aber auch argumentieren, dass es bei Python sowieso nicht so sehr auf die Perfomance ankommt. Wenn das eine wichtige Anforderung wäre, würde man vielleicht von vornherein auf eine andere Sprache wechseln.
In meinem Alltag lese, analysiere und ändere ich Pythoncode vergleichsweise oft. Daher hat Lesbarkeit bei Python einen recht hohen Stellenwert für mich.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@imonbln, wie versprochen: Ein Perfomance Test zu dem Thema
viewtopic.php?f=9&t=53946
Antworten