Convierta una lista de Python con cadenas a minúsculas o mayúsculas
261
Tengo una variable de lista de Python que contiene cadenas. ¿Existe una función de Python que pueda convertir todas las cadenas de una pasada a minúsculas y viceversa, mayúsculas?
¿Por qué "en una pasada"? ¿Contempla la posibilidad de que tome múltiples pases?
John Machin el
¿Cuál debe ser la salida?
O.rka
Respuestas:
440
Se puede hacer con listas de comprensión. Estos básicamente toman la forma de [function-of-item for item in some-list]. Por ejemplo, para crear una nueva lista donde todos los elementos estén en minúscula (o en mayúscula en el segundo fragmento), usaría:
>>>[x.lower()for x in["A","B","C"]]['a','b','c']>>>[x.upper()for x in["a","b","c"]]['A','B','C']
La función de mapa funciona como se esperaba en python2, sin embargo, en python3 puede ajustar el mapa en una lista, por ejemplo:list(map(lambda x:x.upper(),["a","b","c"]))
Tom S
39
La segunda propuesta con el mapa es correcta pero derrochadora. No tiene sentido hacer una función lambda . Solo usemap(str.lower, ["A","B","C"])
fralau
1
Cuando intento imprimir una lista después de esta llamada, nada cambia. ¿Porqué es eso?
imitar el
1
@mimic Un poco tarde, pero para las personas que se encuentran con esto, supongo que su problema probablemente fue que no estaba asignando el resultado de la comprensión de la lista a su lista. El solo hecho de comprender la lista devuelve el valor, pero no lo reasigna a la variable de lista.
Michael Kolber
52
Además de ser más fácil de leer (para muchas personas), las comprensiones de listas también ganan la carrera de velocidad:
$ python2.6-m timeit '[x.lower() for x in ["A","B","C"]]'1000000 loops, best of 3:1.03 usec per loop
$ python2.6-m timeit '[x.upper() for x in ["a","b","c"]]'1000000 loops, best of 3:1.04 usec per loop
$ python2.6-m timeit 'map(str.lower,["A","B","C"])'1000000 loops, best of 3:1.44 usec per loop
$ python2.6-m timeit 'map(str.upper,["a","b","c"])'1000000 loops, best of 3:1.44 usec per loop
$ python2.6-m timeit 'map(lambda x:x.lower(),["A","B","C"])'1000000 loops, best of 3:1.87 usec per loop
$ python2.6-m timeit 'map(lambda x:x.upper(),["a","b","c"])'1000000 loops, best of 3:1.87 usec per loop
¿Sabes la razón detrás de por qué una comprensión de la lista es más rápida que el mapa?
Nixuz
66
No siempre es más rápido. Aquí hay un ejemplo donde no está: stackoverflow.com/questions/1247486/... Pero no es mucho más lento en ese caso. Usar una lambda obviamente hace una gran diferencia. Hay más ejemplos de por qué es peligroso confiar en su intuición sobre problemas de rendimiento, especialmente en Python.
Ned Deily el
3
en python 3, mapgana la carrera, pero no hace nada :)
Jean-François Fabre
@NedDeily map(str.lower,["A","B","C"])es el más rápido es python3.7.5
La comprensión de la lista es cómo lo haría, es la forma "pitónica". La siguiente transcripción muestra cómo convertir una lista a mayúsculas y luego volver a las inferiores:
pax@paxbox7:~$ python3
Python3.5.2(default,Nov172016,17:05:23)[GCC 5.4.020160609] on linux
Type"help","copyright","credits"or"license"for more information.>>> x =["one","two","three"]; x
['one','two','three']>>> x =[element.upper()for element in x]; x
['ONE','TWO','THREE']>>> x =[element.lower()for element in x]; x
['one','two','three']
err, usar listcomo nombre de variable no es la mejor opción :)
Jean-François Fabre
No, pero dado que el nombre es de poca importancia para el método que se muestra, no es realmente relevante. Sin embargo, cambiaré el nombre en caso de que alguien quiera usar el código tal como está.
paxdiablo
La magia del stackoverflow: ¡250 votos para una solución de Python 2 solo usando lambda donde no debería! bien 249 ahora
Jean-François Fabre
@ Jean-FrançoisFabre, no estoy seguro de por qué cree que esta es una solución exclusiva de Python-2. Como muestran las transcripciones, se ejecuta claramente en Python 3.5.2. De hecho, acabo de comprobarlo nuevamente para confirmar. ... pasa un tiempo mientras investigo ... En realidad, no importa, parece que estabas hablando de la respuesta actual aceptada en lugar de esta, por lo que probablemente deberías comentar allí en lugar de aquí. Sin duda un error honesto. Salud.
paxdiablo
1
sí, no estaba criticando la tuya (aparte de las listcosas :)) ¿De dónde crees que proviene la luz ultravioleta que recibiste recientemente? :)
Jean-François Fabre
7
Para esta muestra la comprensión es más rápida.
$ python -m timeit -s 's = ["uno", "dos", "tres"] * 1000' '[x.upper para x en s]'
1000 bucles, lo mejor de 3: 809 usec por bucle
$ python -m timeit -s 's = ["uno", "dos", "tres"] * 1000' 'mapa (str.upper, s)'
1000 bucles, lo mejor de 3: 1,12 ms por bucle
$ python -m timeit -s 's = ["uno", "dos", "tres"] * 1000' 'mapa (lambda x: x.upper (), s)'
1000 bucles, lo mejor de 3: 1.77 ms por bucle
>>> s =[]>>> p =['This','That','There','is','apple']>>>[s.append(i.lower())ifnot i.islower()else s.append(i)for i in p]>>> s
>>>['this','that','there','is','apple']
Esta solución creará una lista separada que contiene los elementos en minúsculas, independientemente de su caso original. Si el caso original es superior, entonces list scontendrá minúsculas del elemento respectivo en list p. Si el caso original del elemento de la lista ya está en minúscula list pentonces el list sretendrá el caso del elemento y mantenerlo en minúsculas. Ahora puedes usar en list slugar de list p.
Si su propósito es hacer coincidir con otra cadena mediante la conversión en una pasada, también puede usar str.casefold().
Esto es útil cuando tiene caracteres no ascii y coincide con versiones ascii (por ejemplo: maße vs masse). Aunque falle str.lowero str.upperfalle en tales casos, str.casefold()pasará. Está disponible en Python 3 y la idea se discute en detalle con la respuesta https://stackoverflow.com/a/31599276/4848659 .
>>>str="Hello World";>>>print(str.lower());
hello world
>>>print(str.upper());
HELLO WOLRD
>>>print(str.casefold());
hello world
In[1]: a ='which option is the fastest'In[2]:%%timeit
...:''.join(a).upper()762 ns ±11.4 ns per loop (mean ± std. dev. of 7 runs,1000000 loops each)In[3]:%%timeit
...: map(lambda x:x.upper(), a)209 ns ±5.73 ns per loop (mean ± std. dev. of 7 runs,1000000 loops each)In[4]:%%timeit
...: map(str.upper,[i for i in a])1.18µs ±11.3 ns per loop (mean ± std. dev. of 7 runs,1000000 loops each)In[5]:%%timeit
...:[i.upper()for i in a]3.2µs ±64.1 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)
Si necesita una cadena o lista como salida y no un iterador (esto es para Python3), compare esta ''.join(string).upper()opción:
In[10]:%%timeit
...:[i for i in map(lambda x:x.upper(), a)]4.32µs ±112 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)
Respuestas:
Se puede hacer con listas de comprensión. Estos básicamente toman la forma de
[function-of-item for item in some-list]
. Por ejemplo, para crear una nueva lista donde todos los elementos estén en minúscula (o en mayúscula en el segundo fragmento), usaría:También puedes usar la
map
función:fuente
list(map(lambda x:x.upper(),["a","b","c"]))
map(str.lower, ["A","B","C"])
Además de ser más fácil de leer (para muchas personas), las comprensiones de listas también ganan la carrera de velocidad:
fuente
map
gana la carrera, pero no hace nada :)map(str.lower,["A","B","C"])
es el más rápido es python3.7.5fuente
str.upper
para convertir a mayúsculasLa comprensión de la lista es cómo lo haría, es la forma "pitónica". La siguiente transcripción muestra cómo convertir una lista a mayúsculas y luego volver a las inferiores:
fuente
list
como nombre de variable no es la mejor opción :)list
cosas :)) ¿De dónde crees que proviene la luz ultravioleta que recibiste recientemente? :)Para esta muestra la comprensión es más rápida.
fuente
un estudiante preguntando, otro estudiante con el mismo problema respondiendo :))
fuente
fuente
Solución:
Esta solución creará una lista separada que contiene los elementos en minúsculas, independientemente de su caso original. Si el caso original es superior, entonces
list s
contendrá minúsculas del elemento respectivo enlist p
. Si el caso original del elemento de la lista ya está en minúsculalist p
entonces ellist s
retendrá el caso del elemento y mantenerlo en minúsculas. Ahora puedes usar enlist s
lugar delist p
.fuente
Si su propósito es hacer coincidir con otra cadena mediante la conversión en una pasada, también puede usar
str.casefold()
.Esto es útil cuando tiene caracteres no ascii y coincide con versiones ascii (por ejemplo: maße vs masse). Aunque falle
str.lower
ostr.upper
falle en tales casos,str.casefold()
pasará. Está disponible en Python 3 y la idea se discute en detalle con la respuesta https://stackoverflow.com/a/31599276/4848659 .fuente
Una versión más simple de la respuesta más común se da aquí por @Amorpheuses.
Con una lista de valores en val:
Esto funcionó bien para mí con una fuente de texto f = open ().
fuente
Puedes intentar usar:
fuente
Python3.6.8
Si necesita una cadena o lista como salida y no un iterador (esto es para Python3), compare esta
''.join(string).upper()
opción:fuente
Si está intentando convertir todas las cadenas a minúsculas en la lista, puede usar pandas:
salida:
fuente