Wie wird das erste Zeichen einer Zeichenfolge in Kleinbuchstaben geschrieben?
73
Es gibt eine Funktion zum Großschreiben eines Strings. Ich möchte das erste Zeichen eines Strings ändern können, um sicherzugehen, dass es in Kleinbuchstaben geschrieben wird.
Gibt es eine Möglichkeit, dies so zu bearbeiten, dass mehr als nur der erste Buchstabe in Kleinbuchstaben geschrieben wird? Ich dachte, ich könnte so etwas tun, s = s[10].lower() + s[11:]aber dies gab mir immer noch nur den ersten Buchstaben in Kleinbuchstaben anstelle der ersten 10.
Cosmictypist
1
@ christylynn002: Sie müssen das Schneiden verwenden. s = s [: 11] .lower () + s [11:]
maedox
21
deffirst_lower(s):iflen(s) == 0:
return s
else:
return s[0].lower() + s[1:]
print first_lower("HELLO") # Prints "hELLO"print first_lower("") # Doesn't crash :-)
Ihre ursprüngliche Antwort war perfekt, ist aber len(s) == 0nur bizarr.
SilentGhost
4
@ SilentGhost: Es ist eine von einer Million gültigen Möglichkeiten, um zu sagen, was es sagt. Es hängt mit dem Problem zusammen, das gelöst werden muss. Sie dürfen den Code nicht ausführen, wenn die Zeichenfolge die Länge Null hat. Deshalb teste ich explizit darauf. Ich hätte sagen können, if not s:aber das repräsentiert das Problem nicht so gut.
RichieHindle
6
@ SilentGhost: Keiner von uns weiß, wie erfahren das OP ist. Es ist leicht, Eckfälle zu übersehen, wenn Ihnen jemand Code zur Verfügung stellt, der nachweislich funktioniert. Ich würde lieber auf Nummer sicher gehen, als eine Antwort zu geben, von der ich weiß, dass sie in einem häufigen Fall fehlschlägt.
RichieHindle
4
Gründliche Antworten wie diese neigen dazu, den Fragesteller besser zu erziehen als prägnante. Angesichts der Tatsache, dass der Fragesteller dies fragt, ist es vernünftig, auf den Eckfall hinzuweisen. Es ist ein zusätzliches Stück Wissen, das der Fragesteller aus der Antwort herausnehmen und berücksichtigen kann, wenn er in Zukunft ähnliche Funktionen ausführt.
JoshD
4
@RichieHindle: Der Test für Strings mit der Länge Null kann weggelassen werden, wenn Slicing verwendet wird: Funktioniert s[:1].lower() + s[1:]auch für leere Strings. Ich bin damit einverstanden, dass keine Notwendigkeit besteht, mit None umzugehen.
Bernd Petersohn
9
Interessanterweise macht keine dieser Antworten genau das Gegenteil von capitalize(). Zum Beispiel capitalize('abC')gibt Abcstatt AbC. Wenn Sie das Gegenteil von wollen capitalize(), brauchen Sie etwas wie:
defuncapitalize(s):iflen(s) > 0:
s = s[0].lower() + s[1:].upper()
return s
In dieser Antwort (von @RichieHindle) finden Sie eine kinderleichtere Lösung, einschließlich der Behandlung leerer Zeichenfolgen. Diese Antwort funktioniert jedoch nicht None, daher hier meine Meinung :
>>> deffirst_lower(s):ifnot s: # Added to handle case where s == Nonereturnelse:
return s[0].lower() + s[1:]
>>> first_lower(None)
>>> first_lower("HELLO")
'hELLO'>>> first_lower("")
>>>
Ja. Ich würde auch gerne wissen, warum dies abgelehnt wurde. Wenn es einen Fehler gibt, werde ich der Erste sein, der es wissen will.
Manoj Govindan
4
Es liegt ein Fehler vor: Wenn Sie eine leere Zeichenfolge übergeben, erhalten Sie None zurück, da Sie eine leere return-Anweisung haben. Das ist nicht intuitiv und führt zwangsläufig zu Fehlern im aufrufenden Code.
Dave Kirby
5
Keine Notwendigkeit, Sonderfälle zu behandeln (und ich denke, die Symmetrie ist eher pythonisch):
Es ist fehleranfällig, überprüfen Sie die Länge von s, bevor Sie die Operation ausführen
harschil9968
0
Ich würde es so schreiben:
deffirst_lower(s):if s == "":
return s
return s[0].lower() + s[1:]
Dies hat den (relativen) Vorteil, dass es einen Fehler auslöst, wenn Sie ihm versehentlich etwas übergeben, das keine Zeichenfolge Noneoder eine leere Liste ist.
Wie wird es eine Ausnahme auslösen, die die anderen Lösungen nicht würden? Die erste Möglichkeit für einen Fehler besteht darin, dass Sie in Scheiben schneiden und alle anderen dies sowieso tun.
Aaronasterling
Nicht so - die akzeptierte Antwort löst beispielsweise keine Ausnahme aus, wenn Sie eine leere Liste übergeben.
hELLO
war das, wonach ich gesucht habe.Antworten:
Einzeiler für leere Saiten und
None
:func = lambda s: s[:1].lower() + s[1:] if s else '' >>> func(None) >>> '' >>> func('') >>> '' >>> func('MARTINEAU') >>> 'mARTINEAU'
quelle
s = "Bobby tables" s = s[0].lower() + s[1:]
quelle
s = s[10].lower() + s[11:]
aber dies gab mir immer noch nur den ersten Buchstaben in Kleinbuchstaben anstelle der ersten 10.def first_lower(s): if len(s) == 0: return s else: return s[0].lower() + s[1:] print first_lower("HELLO") # Prints "hELLO" print first_lower("") # Doesn't crash :-)
quelle
len(s) == 0
nur bizarr.if not s:
aber das repräsentiert das Problem nicht so gut.s[:1].lower() + s[1:]
auch für leere Strings. Ich bin damit einverstanden, dass keine Notwendigkeit besteht, mit None umzugehen.Interessanterweise macht keine dieser Antworten genau das Gegenteil von
capitalize()
. Zum Beispielcapitalize('abC')
gibtAbc
stattAbC
. Wenn Sie das Gegenteil von wollencapitalize()
, brauchen Sie etwas wie:def uncapitalize(s): if len(s) > 0: s = s[0].lower() + s[1:].upper() return s
quelle
capitalize
mit dem Rest der Saite Mist spielt .Einfachster Weg:
>>> mystring = 'ABCDE' >>> mystring[0].lower() + mystring[1:] 'aBCDE' >>>
Aktualisieren
In dieser Antwort (von @RichieHindle) finden Sie eine kinderleichtere Lösung, einschließlich der Behandlung leerer Zeichenfolgen. Diese Antwort funktioniert jedoch nicht
None
, daher hier meine Meinung :>>> def first_lower(s): if not s: # Added to handle case where s == None return else: return s[0].lower() + s[1:] >>> first_lower(None) >>> first_lower("HELLO") 'hELLO' >>> first_lower("") >>>
quelle
Keine Notwendigkeit, Sonderfälle zu behandeln (und ich denke, die Symmetrie ist eher pythonisch):
def uncapitalize(s): return s[:1].lower() + s[1:].upper()
quelle
.upper()
in Ihrer Funktion sein.Ich würde es so schreiben:
def first_lower(s): if s == "": return s return s[0].lower() + s[1:]
Dies hat den (relativen) Vorteil, dass es einen Fehler auslöst, wenn Sie ihm versehentlich etwas übergeben, das keine Zeichenfolge
None
oder eine leere Liste ist.quelle
Dieser doppelte Beitrag führte mich hierher.
Wenn Sie eine Liste von Zeichenfolgen wie die unten gezeigte haben
l = ['SentMessage', 'DeliverySucceeded', 'DeliveryFailed']
Anschließend können Sie den ersten Buchstaben aller Elemente in der Liste konvertieren
l = [x[0].lower() + x[1:] for x in l]
Ausgabe
['sentMessage', 'deliverySucceeded', 'deliveryFailed']
quelle
l = [x[0].lower() + x[1:] for x in list(l)]