einen String in eine Liste umwandeln

Du hast eine Idee für ein Projekt?
Antworten
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

Hallo, ich bin neu hier in eurer Community.
Ich habe folgendes Problem:
Ich möchte ein kleines Programm schreiben, welches die Namenszahl eines bestimmten Namens herausfinden soll. Dazu muss ich den einzelnen Buchstaben des Namens bestimmte Zahlenwerte zuordnen können und dazu will ich eine input-Aufforderung (string) in eine Liste bestehend aus den einzelnen Buchstaben des Namens umwandeln. Ich weiß, wie man grundsätzlich so eine Umwandlung vornimmt:

name = input("Name eingeben: ")
print("Der Name ist " + name)
liste = list[name]
print(liste)

Daraus wird nach Ausführung:

Name eingeben: Harry
Der Name ist Harry
list['Harry']

die Liste sollte aber nicht list ["Harry"] werden, sondern list["H, a, r, r, y"] , so dass ich im weiteren dann den Elementen der Liste entsprechende Zahlenwerte zuordnen kann, deren Quersumme dann zu der gewünschten Namenszahl führt.
Ich hoffe, ihr könnt mir weiterhelfen.

lg,
PanTau
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst zur Nutzung des list-Konstruktors runde Klammern benutzen. Nicht eckige. Die sind zum Index-Zugriff bestimmt. Entsprechend laeuft das auch nicht, sondern schmeisst einen TypeError.

Code: Alles auswählen

>>> list(name)
['H', 'a', 'r', 'r', 'y']
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

__deets__ hat geschrieben: Freitag 14. Januar 2022, 18:23 sondern schmeisst einen TypeError.
Seit Python 3.9 (leider?) nicht mehr. PEP 585 ist Schuld.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist nicht deren Ernst...
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Das ist der Moment wo type-hints nicht nur ignorierbar sind sondern Dinge in der Sprache kaputt machen...
PanTau
User
Beiträge: 26
Registriert: Freitag 14. Januar 2022, 17:24

__deets__ hat geschrieben: Freitag 14. Januar 2022, 18:23 Du musst zur Nutzung des list-Konstruktors runde Klammern benutzen. Nicht eckige. Die sind zum Index-Zugriff bestimmt. Entsprechend laeuft das auch nicht, sondern schmeisst einen TypeError.

Code: Alles auswählen

>>> list(name)
['H', 'a', 'r', 'r', 'y']

Ich danke dir, manchmal liegt die Lösung so nahe
oldboyJR
User
Beiträge: 18
Registriert: Donnerstag 28. März 2024, 16:19

Denkanstoß?
S = "koammtrenner"
S.replace("", ",")
K = S.replace("", ", ,")
print(S.replace("", ", ,"))
print (K)
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

wieso gibt man denn den type-hints "soviel" Aufmerksamkeit, wenn es dem Interpreter letztendlich egal ist?
Python 3.11:

Code: Alles auswählen

test: list[str] = [1 ,2]
test
Out[14]: [1, 2]
@oldboyJR Was ist das Ziel deines letzten Posts?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dennis89: Weil man den Code ja durch ein entsprechendes Werkzeug prüfen lässt, während man ihn entwickelt. Dem Werkzeug ist das dann nicht egal:

Code: Alles auswählen

$ cat forum25.py
test: list[str] = [1, 2]
$ mypy forum25.py
forum25.py:1: error: List item 0 has incompatible type "int"; expected "str"  [list-item]
forum25.py:1: error: List item 1 has incompatible type "int"; expected "str"  [list-item]
Found 2 errors in 1 file (checked 1 source file)
Am besten natürlich im Editor/der IDE integriert, damit man da nicht manuell ausserhalb den Testvorgang anwerfen muss. Beispielsweise kontinuierlich oder immer beim Speichervorgang der Datei.

@oldboyJR: Die Frage war nach einer Liste mit den einzelnen Buchstaben als Elementen, nicht nach einer Zeichenkette die so ähnlich aussieht wie die Zeichenkettendarstellung einer Liste.

Ein `replace()` der leeren Zeichenkette zwischen den Zeichen ist zwar ein interessanter Randfall, aber dadurch hat man ja auch die Kommas vor und nach den ganzen Zeichen. Ein `", ,".join()` würde die nur zwischen Zeichen setzen. Vergleich:

Code: Alles auswählen

In [336]: S = "Kommatrenner"

In [337]: S.replace("", ", ")
Out[337]: ', K, o, m, m, a, t, r, e, n, n, e, r, '

In [338]: ", ".join(S)
Out[338]: 'K, o, m, m, a, t, r, e, n, n, e, r'
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Vielen Dank. Das heißt für mich auch, das ihr in Programmen die produktiv im Einsatz sind, an Stellen an denen es sinnvoll erscheint, type-hints verwendet und die entsprechend testet.(?)
Aber das sind dann ja nur Programmteile, auf die der Benutzer keinen EInfluss hat, weil wenn der Test fehl schlägt, kann ich nachher trotzdem die Liste mit Integer füllen. Wo macht so ein Test denn Sinn? Wenn ich Code schreibe und eine Liste mit Strings erwarte, da aber versehentlich Integer rein schreibe, dann fällt mir der Code so oder so auf die Füße und ich merke das beim entwickeln.


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Dennis89
Es vereinfacht den IDEs bereits zur Entwicklungszeit mithilfe statischer Checks zu prüfen, ob die verschiedenen Aufrufe im Quelltext die erwarteten Typen als Parameter erhalten. Zumindest kommt es mir bei PyCharm so vor, dass der dann schneller Warnungen anzeigt, ohne dass der Code tatsächlich laufen musste. Das setzt natürlich voraus, dass man als Entwickler bei den Type-Hints alles richtig gemacht hat. Auch finde ich gewisse statische Typvorgaben gar nicht mal so schlecht als Unterstützung, um eine sauber durchdachte API zu entwerfen. Wobei natürlich die Type-Hints kein Ersatz für "richtige" Tests sein können, eher eine Ergänzung.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dennis89: Ich verwende keine Typannotationen, habe aber im Editor eine Überprüfung integriert, für Code aus Foren um zu prüfen ob Leute die Fragen haben und Typannotationen drin haben, die auch richtig verwenden, um auf Fehler hinweisen zu können, beziehungsweise wie wichtig das ist Typannotationen auch tatsächlich statisch prüfen zu lassen. Denn das sind im Grunde so etwas wie Kommentare welche Typen da erwartet/verwendet werden. Normale Kommentare sollten schon korrekt sein, aber bei Typannotationen ist das noch wichtiger, weil der Leser noch stärker davon ausgeht, dass die stimmen, weil die ja automatisiert überprüft werden können, und es damit keine Ausrede für Fehler dabei gibt.

Das Fehler beim testen sowieso auf die Füsse fallen, und man mindestens für produktiven Code Unit-Tests schreiben sollte, ist einer der Gründe warum ich Typannotationen nicht so sinnvoll finde. Dazu kommt dann das sie Code IMHO unübersichtlicher machen, und oft unnötig einschränkend sind weil man zu faul ist das wirklich zu durchdenken. Oder bei Anfängern das Wissen dafür einfach noch nicht da ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Vielen Dank für die Erklärungen 👍🏼
"When I got the music, I got a place to go" [Rancid, 1993]
oldboyJR
User
Beiträge: 18
Registriert: Donnerstag 28. März 2024, 16:19

Entschuldigt die falsche Form

Code: Alles auswählen

def Trenner ():
    S = "Kommartrenner "# =Name der aufgelöst werden soll
    S.replace("", ",")# Befehl der Auflösung norm
    K = S.replace("", ",""WERT:"",")# Befehl Auflösung für zweite Komponente 
    #eines Dictionarys  beachte K (ergebnis) = (Argument/e Operation
    #oder Operator) 
    print(S.replace("", ",""WERT:"",")) #ergebnis 1
    print (K)# beweis das K das selbe ergebnis ist 
Trenner()
Ich stecke auch noch in den Anfängen von Python und habe noch nicht den zweiten Schritt
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

@oldboyJR: Das ist sowohl vom Code als auch vom Ergebnis eher unverständlich.
Was möchtest du denn damit zeigen?
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

Und der Text um den Code ist auch nicht sehr aufschlussreich. Es wäre schön, wenn du ein bisschen ausführlicher beschreiben könntest, worum es dir geht, @oldboyJR. :-)
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@oldboyJR: Was soll denn *der* Schwachsinn bitte: ",""WERT:""," ??? Es gibt keinen Grund ",WERT:," dermassen kryptisch auszudrücken, ausser man will absichtlich etwas schwer verständliches schreiben. Und dann bleibt auch bei der offensichtlicheren Schreibweise die Frage die schon gestellt wurde: Was soll das zeigen?

Die Kommentare machen inhaltlich wenig bis keinen Sinn. Was soll ”Auflösen” bedeuten? Und warum sollte man das so machen wollen vor und nach jedem Zeichen ein Komma zu setzen? Wo kommt ein Wörterbuch ins Spiel? In dem gezeigten Code jedenfalls nicht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten