2010-10-01 9 views
39

Hay una función para poner mayúscula en una cadena, me gustaría poder cambiar el primer carácter de una cadena para asegurarse de que esté en minúscula.¿Cómo descifrar el primer carácter de una cadena?

¿Cómo puedo hacer eso en Python?

+3

¿Estás seguro de que s.lower() no es lo que quieres? De lo contrario, podría obtener resultados extraños como 'hELLO'. –

+1

'hELLO' era lo que estaba buscando. – Natim

Respuesta

41

de una sola línea que se ocupa de las cadenas vacías y None:

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

>>> func(None) 
>>> '' 
>>> func('') 
>>> '' 
>>> func('MARTINEAU') 
>>> 'mARTINEAU' 
18
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 :-) 
+3

su respuesta original fue perfecta, pero 'len (s) == 0' es simplemente bizzare. – SilentGhost

+3

@SilentGhost: es uno de los millones de formas válidas de decir lo que dice. Está relacionado con el problema que está ahí para resolver: no debes ejecutar el código si la cadena es de longitud cero, así que eso es explícitamente lo que estoy probando. Podría haber dicho 'if not s:' pero eso no representa el problema tan bien. – RichieHindle

+2

Prefiero 'if not len ​​(s)' personalmente, pero eso es solo ser quisquilloso – Daenyth

3

manera más simple:

>>> mystring = 'ABCDE' 
>>> mystring[0].lower() + mystring[1:] 
'aBCDE' 
>>> 

actualización

Ver this answer (por @RichieHindle) para una solución más a toda prueba, incluyendo el manejo de cadenas vacías. Esa respuesta no maneja None embargo, por lo que aquí es mi opinión:

>>> 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("") 
>>> 
+0

Aye. También me gustaría saber por qué esto no fue votado. Si hay un error, seré el primero en querer saber. –

+3

Se ha cometido un error: si pasa una cadena vacía, se devuelve None, ya que tiene una declaración de devolución vacía. Eso no es intuitivo y está obligado a provocar errores en el código de llamada. –

16
s = "Bobby tables" 
s = s[0].lower() + s[1:] 
+4

+1 para tablas Bobby :) – Skilldrick

+1

'Exploits of a Mom' :) – st0le

+0

¿Hay alguna manera de editar esto en minúsculas más que la primera letra? Pensé que podría hacer algo como 's = s [10] .lower() + s [11:]' pero esto solo me dio la primera letra en minúscula en lugar de los primeros 10. – cosmictypist

7

Curiosamente, ninguna de estas respuestas hace exactamente lo contrario decapitalize(). Por ejemplo, capitalize('abC') devuelve Abc en lugar de AbC. Si desea que el opuesto de capitalize(), necesita algo como:

def uncapitalize(s): 
    if len(s) > 0: 
    s = s[0].lower() + s[1:].upper() 
    return s 
+0

No creo que sea la intención del OP –

+1

@Xavier: Probablemente tengas razón, pero es interesante que las mayúsculas 'capitalize' con el resto de la cadena. –

+0

sí, es interesante que valga la pena su +1 –

0

me gustaría escribir de esta manera:

def first_lower(s): 
    if s == "": 
     return s 
    return s[0].lower() + s[1:] 

Esto tiene el mérito (relativa) que generará un error si inadvertidamente le pasa algo que no es una cadena, como None o una lista vacía.

+0

¿cómo se planteará una excepción que las otras soluciones no? La primera oportunidad para un error es cuando cortes y todos los demás lo hacen de todos modos. – aaronasterling

+0

No es así - la respuesta aceptada, por ejemplo, no genera una excepción si la pasa una lista vacía. –

3

No hay necesidad de manejar casos especiales (y creo que la simetría es más Pythonic):

def uncapitalize(s): 
    return s[:1].lower() + s[1:].upper() 
+5

No debería haber '.upper()' en su función. –

+1

Es propenso a error, verifique la longitud de s antes de realizar la operación – harshil9968

0

este duplicado post guíame aquí.

Si usted tiene una lista de cadenas como la que se muestra a continuación

l = ['SentMessage', 'DeliverySucceeded', 'DeliveryFailed'] 

Entonces, para convertir la primera letra de todos los elementos de la lista, puede utilizar

l = [x[0].lower() + x[1:] for x in l] 

salida

['sentMessage', 'deliverySucceeded', 'deliveryFailed'] 
+0

Ni siquiera necesita usar enumerar en ese caso: 'l = [x [0] .lower() + x [1:] para x en la lista (l)] ' – Natim

+0

@Natim gracias! ¡Me acabo de dar cuenta de que no necesito 'i'! –

Cuestiones relacionadas