Listeneintrag bearbeiten

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
Bindl
User
Beiträge: 70
Registriert: Donnerstag 27. Oktober 2016, 11:48

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
Bindl
User
Beiträge: 70
Registriert: Donnerstag 27. Oktober 2016, 11:48

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)
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.
Bindl
User
Beiträge: 70
Registriert: Donnerstag 27. Oktober 2016, 11:48

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 ?
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…
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.
Bindl
User
Beiträge: 70
Registriert: Donnerstag 27. Oktober 2016, 11:48

Hi,

ich könnte natürlich auch

Code: Alles auswählen

b=str(a)
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.
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?
Bindl
User
Beiträge: 70
Registriert: Donnerstag 27. Oktober 2016, 11:48

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.

Code: Alles auswählen

a=["hallO"]
b=a.pop(0)
print(b)
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.
Antworten