Seite 1 von 1
Listeneintrag bearbeiten
Verfasst: Dienstag 23. Mai 2017, 11:20
von Bindl
Hi zusammen,
ich möchte einen Nachnamen in einen leere Liste einspeichern.
Bei Nachnamen soll nur der erste Buchstabe soll nur der erste Buchstabe groß geschrieben sein.
Bei mir kommt jedoch immer eine Fehlermeldung.
'list' object has no attribute 'title'
Code: Alles auswählen
a=str(input("Nachname: "))
b=[]
b.append(a)
b.title()
print(b)
Wird mit .title() nicht nur der erste Buchstabe groß und alles andere klein ?
Ich habe 2 weitere Varianten, bin mir nicht ganz sicher wies richtig geht. Ich bekomme ja immer Fehlermeldungen.
Code: Alles auswählen
a=str(input("Nachname: "))
b=[]
b.append(a)
b.lower()
b.upper(b[0])
print(b)
Oder
Code: Alles auswählen
a=str(input("Nachname: "))
b=[]
b.append(a)
b.lower()
b.title()
print(b)
Ich hoffe Ihr könnt mir helfen
Re: Listeneintrag bearbeiten
Verfasst: Dienstag 23. Mai 2017, 11:30
von Bindl
Auch so geht es leider nicht:
Code: Alles auswählen
a=["HallO"]
b=""
for i in a:
b+=str(i)
b.lower()
b.title()
print(b)
Re: Listeneintrag bearbeiten
Verfasst: Dienstag 23. Mai 2017, 11:57
von BlackJack
@Bindl: Ja mit der `title()`-Methode auf *Zeichenketten* bekommt man die Zeichenkette mit dem ersten Buchstaben gross, und dem Rest klein. Und wenn man versucht eine `title()`-Methode auf einer *Liste* aufzurufen, bekommt man die entsprechende Fehlermeldung, denn *Listen* haben so eine Methode nicht. Die gibt's auf *Zeichenketten*.
Code: Alles auswählen
In [12]: 'meier'.title()
Out[12]: 'Meier'
In [13]: ['meier'].title()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-13-c0b5e6f841f4> in <module>()
----> 1 ['meier'].title()
AttributeError: 'list' object has no attribute 'title'
Letztlich ist das aber sowieso eine schlechte Idee, denn es gibt viele Nachnamen bei denen das nicht so leicht funktioniert, weil auch Teile darin vorkommen die klein geschrieben werden müssen. Beispielsweise:
Code: Alles auswählen
In [18]: print(u'Jürgen von der Lippe'.title())
Jürgen Von Der Lippe
Lass den Benutzer seinen Namen einfach selbst so eingeben wie er geschrieben wird, oder *er* ihn geschrieben haben möchte.
Re: Listeneintrag bearbeiten
Verfasst: Dienstag 23. Mai 2017, 12:14
von Bindl
Danke für die Antwort.
Grundsätzlich sehe ich das auch so, nur unser Prof legt immer wert drauf das man alle Variante durchspielt.
Ich würde noch gerne alle Zahlen und Sonderzeichen aus dem String holen und kenne eigentlich nur die replace Methode, nur kann man da ja nur ein Zeichen durch eine weiteres ersten. Nun möchte ich ja eine ganze Reihe an Zeichen entfernen und habe beim google mal den filter Befehl ausgeschnappt und habe ich eine Frage wie ich diesen genau anwende.
Code: Alles auswählen
import string
a=["Hall1O"]
b=""
for i in a:
b+=str(i)
b=b.lower()
filter((string.ascii_letters).__contains__, b)
b=b.title()
print(b)
So wollte ich die 1 herausbekommen, hat nicht geklappt.
Leider wird auch das O am Ende noch groß ausgegeben.
Was mache ich falsch ?
Re: Listeneintrag bearbeiten
Verfasst: Dienstag 23. Mai 2017, 12:25
von BlackJack
@Bindl: Filter liefert, je nach Python-Version, eine Liste oder einen Iterator. Die Funktion verändert nicht die Zeichenkette. Das kann auch gar nicht gehen weil Zeichenketten nicht veränderbar sind. In keiner Python-Version.
Da man aus den gefilterten Buchstaben wieder eine Zeichenkette machen muss, ist ein ``''.join(…)`` mit einem Generatorausdruck als Argument der das filtern erledigt, einfacher zu schreiben.
Dir ist klar das Umlaute nicht in ASCII enthalten sind? Du dann also bei meinem letzten Beispiel nicht nur falsche Gross-/Kleinschreibung haben wirst, sondern auch noch relevante Zeichen verwirfst‽ 'Jrgen Von Der Lippe' wird sich bedanken.
Wobei Du bei `string.ascii_letters` auch Leerzeichen wegwerfen würdest ('Jrgenvonderlippe') und Bindestriche ('Mllerldenscheidt') und Anführungszeichen ('Oreilly'), und…
Re: Listeneintrag bearbeiten
Verfasst: Dienstag 23. Mai 2017, 12:27
von BlackJack
Über die Zeilen 3 bis 5 solltest Du übrigens auch dringend mal nachdenken. Das ist hochgradig unsinnig eine Zeichenkette auf diese Weise aus einer Liste zu holen. Warum steckt die überhaupt in einer Liste? Listen mit grundsätzlich *einem* Element machen keinen Sinn. Und wenn da mehr als ein Element drin stehen sollte, dann macht die Schleife sicher nicht das was Du dann haben möchtest.
Re: Listeneintrag bearbeiten
Verfasst: Dienstag 23. Mai 2017, 12:34
von Bindl
Hi,
ich könnte natürlich auch
schreiben, nur habe ich ja dann noch die eckigen Klammern und die beiden Anführungszeichen.
Ich weiß grad nicht wie diese 4 Zeichen weg bekomme.
Re: Listeneintrag bearbeiten
Verfasst: Dienstag 23. Mai 2017, 12:38
von BlackJack
@Bindl: Das ist mindestens genau so schlimm. Du könntest auch einfach das Element aus der Liste nehmen. Das ist ja bereits eine Zeichenkette. Oder, ganz abgefahren: Steck es halt gar nicht erst in die Liste. Warum machst Du das?
Re: Listeneintrag bearbeiten
Verfasst: Dienstag 23. Mai 2017, 12:55
von Bindl
Weil ich über ein HTML Formular den eigebenen Nachnamen als String zurück.
Ich habe, hoffe ich zumindest, eine gute Lösung gefunden den String aus der Liste zu bekommen.
Re: Listeneintrag bearbeiten
Verfasst: Dienstag 23. Mai 2017, 14:02
von BlackJack
@Bindl: Wenn Du den Namen als Zeichenkette bekommst, ist mir immer noch nicht klar warum Du das in eine Liste steckst.
Und `pop()` ist auch nicht der einfachste und naheliegendste Weg, es sei denn man möchte tatsächlich das erste Element der Liste auch *entfernen* statt es nur an einen Namen zu binden. Du solltest dringend ein Grundlagentutorial durcharbeiten.