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.

Wie kann ich das in Python machen?

Natim
quelle
4
Sind Sie sicher, dass s.lower () nicht das ist, was Sie wollen? Andernfalls könnten Sie seltsame Ergebnisse wie "Hallo" erhalten.
Leonid Shvechikov
3
hELLOwar das, wonach ich gesucht habe.
Natim

Antworten:

75

Einzeiler für leere Saiten und None:

func = lambda s: s[:1].lower() + s[1:] if s else ''

>>> func(None)
>>> ''
>>> func('')
>>> ''
>>> func('MARTINEAU')
>>> 'mARTINEAU'
Martineau
quelle
34
s = "Bobby tables"
s = s[0].lower() + s[1:]
JoshD
quelle
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
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  :-)
RichieHindle
quelle
4
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:

def uncapitalize(s):
  if len(s) > 0:
    s = s[0].lower() + s[1:].upper()
  return s
Adrian McCarthy
quelle
Ich glaube nicht, dass es die Absicht des OP ist
Xavier Combelle
1
@ Xavier: Du hast wahrscheinlich recht, aber es ist interessant, dass capitalizemit dem Rest der Saite Mist spielt .
Adrian McCarthy
7

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("")
>>> 
Manoj Govindan
quelle
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):

def uncapitalize(s):
    return s[:1].lower() + s[1:].upper()
Don O'Donnell
quelle
7
Es sollte nicht .upper()in Ihrer Funktion sein.
Stier Olson
2
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:

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 Noneoder eine leere Liste ist.

Robert Rossney
quelle
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.
Robert Rossney
0

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']
Van Peer
quelle
In diesem Fall müssen Sie nicht einmal die Aufzählung verwenden:l = [x[0].lower() + x[1:] for x in list(l)]
Natim