Eu tenho uma variável de lista python que contém seqüências de caracteres. Existe uma função python que pode converter todas as seqüências de caracteres em uma passagem para minúsculas e vice-versa, maiúsculas?
Eu tenho uma variável de lista python que contém seqüências de caracteres. Existe uma função python que pode converter todas as seqüências de caracteres em uma passagem para minúsculas e vice-versa, maiúsculas?
Respostas:
Isso pode ser feito com a compreensão da lista. Estes basicamente tomam a forma de [function-of-item for item in some-list]
. Por exemplo, para criar uma nova lista na qual todos os itens são minúsculos (ou minúsculos no segundo snippet), você usaria:
>>> [x.lower() for x in ["A","B","C"]]
['a', 'b', 'c']
>>> [x.upper() for x in ["a","b","c"]]
['A', 'B', 'C']
Você também pode usar a map
função:
>>> 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"])
Além de ser mais fácil de ler (para muitas pessoas), as compreensões de lista também vencem a corrida de velocidade:
$ 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
map
vence a corrida, mas não faz nada :)
map(str.lower,["A","B","C"])
é mais rápida é python3.7.5
>>> map(str.lower,["A","B","C"])
['a', 'b', 'c']
str.upper
para converter para maiúsculas
A compreensão da lista é como eu faria isso, é o caminho "pitônico". A transcrição a seguir mostra como converter uma lista para todas as letras maiúsculas e depois voltar para menor:
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']
list
como um nome de variável não é a melhor escolha :)
list
coisas :)) De onde você acha que vem o UV que você adquiriu recentemente? :)
Para esta amostra, a compreensão é mais rápida
$ python -m timeit -s 's = ["um", "dois", "três"] * 1000' '[x.upper para x em s]' 1000 loops, o melhor de 3: 809 usec por loop $ python -m timeit -s 's = ["um", "dois", "três"] * 1000' 'map (str.upper, s)' 1000 loops, o melhor de 3: 1,12 mseg por loop $ python -m timeit -s 's = ["um", "dois", "três"] * 1000' 'mapa (lambda x: x.upper (), s)' 1000 loops, o melhor de 3: 1,77 ms por loop
Solução:
>>> 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 solução criará uma lista separada contendo os itens em minúsculas, independentemente da caixa original. Se a caixa original for maiúscula, list s
ela conterá letras minúsculas do respectivo item em list p
. Se a caixa original do item da lista já estiver em minúscula list p
, list s
ela reterá a caixa do item e a manterá em minúscula. Agora você pode usar em list s
vez de list p
.
Se seu objetivo é corresponder a outra sequência convertendo em uma passagem, você também pode usá-lo str.casefold()
.
Isso é útil quando você possui caracteres não-ascii e combina com versões ascii (por exemplo: maße vs masse). Embora str.lower
ou str.upper
falhe nesses casos, str.casefold()
será aprovado. Está disponível no Python 3 e a idéia é discutida em detalhes com a resposta https://stackoverflow.com/a/31599276/4848659 .
>>>str="Hello World";
>>>print(str.lower());
hello world
>>>print(str.upper());
HELLO WOLRD
>>>print(str.casefold());
hello world
Você pode tentar 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)
Se você precisar de uma string ou lista como saída e não um iterador (isso é para Python3), compare a ''.join(string).upper()
opção com esta:
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)
Se você estiver tentando converter todas as seqüências de caracteres para minúsculas na lista, poderá usar os pandas:
import pandas as pd
data = ['Study', 'Insights']
pd_d = list(pd.Series(data).str.lower())
resultado:
['study', 'insights']