Converter uma lista Python com seqüências de caracteres todas em minúsculas ou maiúsculas
261
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?
Por que "de uma só vez"? Você considera a possibilidade de fazer vários passes?
John Machin
O que a saída precisa ser?
O.rka
Respostas:
440
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']
A função de mapa funciona como esperado em python2, no entanto, em python3 você para quebrar o mapa em uma lista ex:list(map(lambda x:x.upper(),["a","b","c"]))
Tom S
39
A segunda proposição com o mapa está correta, mas é um desperdício. Não faz sentido criar uma função lambda . Apenas usemap(str.lower, ["A","B","C"])
fralau
1
Quando tento imprimir uma lista após esta chamada, nada muda. Por que é que?
imitar
1
@mimic Um pouco tarde, mas para as pessoas que se deparam com isso, acho que o seu problema provavelmente foi que você não estava atribuindo o resultado da compreensão da lista de volta à sua lista. Apenas fazer com a compreensão da lista retorna o valor, mas não o reatribui à variável da lista.
Michael Kolber
52
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
Você sabe o motivo por que a compreensão de uma lista é mais rápida que o mapa?
Nixuz 26/11/2009
6
Nem sempre é mais rápido. Aqui está um exemplo em que não é: stackoverflow.com/questions/1247486/… Mas nesse caso não é muito mais lento. Usar um lambda obviamente faz uma grande diferença. Há mais exemplos de por que é perigoso confiar na sua intuição em questões de desempenho, especialmente no Python.
Ned Deily
3
no python 3, mapvence a corrida, mas não faz nada :)
Jean-François Fabre
@NedDeily map(str.lower,["A","B","C"])é mais rápida é python3.7.5
obviamente, str.upperpara converter para maiúsculas
John La Rooy
20
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
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, usando listcomo um nome de variável não é a melhor escolha :)
Jean-François Fabre
Não, mas como o nome é de pouca importância para o método mostrado, ele não é realmente relevante. No entanto, mudarei o nome caso alguém queira usar o código como está.
22418
a mágica do stackoverflow: 250 votos para uma solução somente em python 2 usando lambda onde não deveria !! bem 249 agora
Jean-François Fabre
@ Jean-FrançoisFabre, não sei por que você acha que essa é uma solução apenas para Python-2. Como as transcrições mostram, está claramente sendo executado no Python 3.5.2. Na verdade, eu apenas verifiquei novamente para confirmar. ... algum tempo passa enquanto eu investigo ... Na verdade, não importa, parece que você estava falando sobre a resposta atualmente aceita em vez desta, então você provavelmente deveria comentar aqui e não aqui. Sem dúvida, um erro honesto. Felicidades.
22418
1
Sim, eu não estava criticando a sua (além das listcoisas :)) De onde você acha que vem o UV que você adquiriu recentemente? :)
Jean-François Fabre
7
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
>>> 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 solução criará uma lista separada contendo os itens em minúsculas, independentemente da caixa original. Se a caixa original for maiúscula, list sela 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 sela reterá a caixa do item e a manterá em minúscula. Agora você pode usar em list svez 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.lowerou str.upperfalhe 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
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)
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:Você também pode usar a
map
função:fonte
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:
fonte
map
vence a corrida, mas não faz nada :)map(str.lower,["A","B","C"])
é mais rápida é python3.7.5fonte
str.upper
para converter para maiúsculasA 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:
fonte
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
fonte
um aluno perguntando, outro aluno com o mesmo problema em responder :))
fonte
fonte
Solução:
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 emlist p
. Se a caixa original do item da lista já estiver em minúsculalist p
,list s
ela reterá a caixa do item e a manterá em minúscula. Agora você pode usar emlist s
vez delist p
.fonte
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
oustr.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 .fonte
Uma versão muito mais simples da resposta principal é dada aqui por @Amorpheuses.
Com uma lista de valores em val:
Isso funcionou bem para mim com uma fonte de texto f = open ().
fonte
Você pode tentar usar:
fonte
Python3.6.8
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:fonte
Se você estiver tentando converter todas as seqüências de caracteres para minúsculas na lista, poderá usar os pandas:
resultado:
fonte