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?

usuario219126
fuente
¿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']

También puedes usar la mapfunción:

>>> map(lambda x:x.lower(),["A","B","C"])
['a', 'b', 'c']
>>> map(lambda x:x.upper(),["a","b","c"])
['A', 'B', 'C']

fuente
12
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
Ned Deily
fuente
44
¿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
SHIVAM JINDAL
40
>>> map(str.lower,["A","B","C"])
['a', 'b', 'c']
ghostdog74
fuente
obviamente, str.upperpara convertir a mayúsculas
John La Rooy
20

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
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] 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']
paxdiablo
fuente
2
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
John La Rooy
fuente
5

un estudiante preguntando, otro estudiante con el mismo problema respondiendo :))

fruits=['orange', 'grape', 'kiwi', 'apple', 'mango', 'fig', 'lemon']
newList = []
for fruit in fruits:
    newList.append(fruit.upper())
print(newList)
Cristina
fuente
3
mylist = ['Mixed Case One', 'Mixed Case Two', 'Mixed Three']
print(list(map(lambda x: x.lower(), mylist)))
print(list(map(lambda x: x.upper(), mylist)))
Chirael
fuente
2

Solución:

>>> s = []
>>> p = ['This', 'That', 'There', 'is', 'apple']
>>> [s.append(i.lower()) if not 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.

Sunil
fuente
1

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
Gimhani
fuente
1

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:

valsLower = [item.lower() for item in vals]

Esto funcionó bien para mí con una fuente de texto f = open ().

Zeesy
fuente
1

Puedes intentar usar:

my_list = ['india', 'america', 'china', 'korea']

def capitalize_list(item):
    return item.upper()

print(list(map(capitalize_list, my_list)))
usuario10821509
fuente
0

Python3.6.8

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)
aerijman
fuente
0

Si está intentando convertir todas las cadenas a minúsculas en la lista, puede usar pandas:

import pandas as pd

data = ['Study', 'Insights']

pd_d = list(pd.Series(data).str.lower())

salida:

['study', 'insights']
Aaditya Ura
fuente