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?
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?
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:
>>> [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']
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:
$ 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
mapgana la carrera, pero no hace nada :)
map(str.lower,["A","B","C"])es el más rápido es python3.7.5
>>> map(str.lower,["A","B","C"])
['a', 'b', 'c']
str.upperpara convertir a mayúsculas
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']
listcomo nombre de variable no es la mejor opción :)
listcosas :)) ¿De dónde crees que proviene la luz ultravioleta que recibiste recientemente? :)
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
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.
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
Puedes intentar usar:
my_list = ['india', 'america', 'china', 'korea']
def capitalize_list(item):
return item.upper()
print(list(map(capitalize_list, my_list)))
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)
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']