Vriabel-Liste erstellen

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.
Antworten
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']
Zahlenliste = [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
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PanTau: Vielleicht erst einmal was zur Namensgebung: Keine kryptischen Abkürzungen. Wenn Du einen Namen `Dict_Var` hast, und dazu einen Kommentar in dem das als „Dictionairy_Variablen“ beschrieben wird, dann sollte der Name selbst `Dictionairy_Variablen` lauten, damit man a) die Abkürzung nicht in einem Kommentar erklären muss, und b) der sprechendere, nicht abgekürzte Name dann nicht nur bei der Definition mit dem Kommentar zu lesen ist, sondern auch dort, wo dann über den Namen auf den Wert zugegriffen wird.

Dann `Dictionairy_Variablen` inhaltlich: das sagt nicht so wirklich gut aus was da denn nun von der Bedeutung her enthalten ist. Bei Abbildungen im Allgemeinen und Wörterbüchern im Besonderen, macht es in der Regel Sinn die nach dem Muster Schlüsslname_zu_Wertname zu benennen, also was wäre ein sinnvoller Name für einen Schlüssel und was wäre ein sinnvoller Name für einen dazugehörigen Wert. Hier beispielsweise etwa `Buchstabe_zu_Zahlwert` oder so ähnlich.

Als drittes dann die formale Schreibweise: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Also `BUCHSTABE_ZU_ZAHLWERT`, weil es sich von der Bedeutung her um eine Konstante handelt.

Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht. Im Grunde sagt keiner der vorhandenen Kommentare etwas das nicht entweder schon deutlich im Code steht, oder durch bessere Namen dort deutlich stehen würde.

`liste` ist kein guter Name wenn es sich nicht tatsächlich um eine generische Liste mit beliebigem Inhalt handelt. Und Du verwerdest den Namen zweimal, für verschiedene Dinge, und in zweiten Fall ist er auch *falsch*, weil Du da gar keine Liste(n) dran bindest in der Schleife.

In der Schleife über `Dict_Var.values()` wird über die Werte des Wörterbüchers iteriert und das sind ja keine Listen, sondern einzelne ganze Zahlen (`int`), für jeden Buchstaben eine Zahl. Und genau das sagt die Fehlermeldung wenn Du versuchst zu einer Zeichenkette eine Zahl zu addieren. Das geht nicht, weil das auch nicht wirklich Sinn macht. Was sollte beispielsweise ``"hallo" + 42`` denn auch bedeuten. Es gibt Programmiersprachen da geht das, da wird dann je nach Sprache für "hallo" einfach ein Wert angenommen, wie beispielsweise 0 wenn es sich nicht um eine Zeichenkette handelt die einen Zahlwert repräsentiert, oder es wird automagisch das zweite Argument in eine Zeichenkette umgewandelt und das Ergebnis ist "hallo42". So etwas macht Python nicht, das ist da strenger in der Trennung von Datentypen und geht davon aus, dass der Programmierer an dieser Stelle explizit sagen muss was er machen will, und dafür sorgen muss, das beide Seiten der ``+``-Operation einen Typ haben der ”passt”.

Das mit der Addition wäre auch nicht gegangen wenn `liste` tatsächlich eine Liste gewesen wäre, weil dann wieder die Frage ist was so etwas wie ``"hallo" + [42, 23]`` denn eigentlich bedeuten sollte:

Code: Alles auswählen

In [5]: "hallo" + [42, 23]                                                      
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-61076206d8c6> in <module>
----> 1 "hallo" + [42, 23]

TypeError: must be str, not list
Wenn man das geradezieht, käme so etwas hier heraus:

Code: Alles auswählen

#!/usr/bin/env python3

BUCHSTABE_ZU_ZAHLWERT = {
    "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,
}


def main():
    print("Willkommen zur Berechnung und Deutung der Namenszahl")

    name = input("Name eingeben: ")
    print("Der Name lautet", name)
    zeichen = list(name)
    print(zeichen)

    for zahlwert in BUCHSTABE_ZU_ZAHLWERT.values():
        print("Zahl", zahlwert)


if __name__ == "__main__":
    main()
Die Liste `zeichen` bräuchte man nicht unbedingt, weil Zeichenketten selbst ja schon iterierbar sind, und dabei die einzelnen Zeichen liefern. Sonst hätte die Umwandlung in eine Liste mit `list()` so auch gar nicht funktioniert.

Du suchst jetzt eine Möglichkeit von einem Wörterbuch die Zahl zu einem gegebenen Zeichen zu ermitteln, am besten schon mit der Möglichkeit für in der Tabelle nicht vorhandene Zeichen eine 0 zu liefern. Oder vielleicht auch eine 1, je nach dem was bei der Verrechnung dieser Werte dann günstiger ist. Schau Dir mal an was Wörterbücher so an Methoden bieten, da gibt es etwas passendes.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten