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']

Você também pode usar a mapfunção:

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

12
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

4
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
SHIVAM JINDAL


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
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']

2
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

5

um aluno perguntando, outro aluno com o mesmo problema em responder :))

fruits=['orange', 'grape', 'kiwi', 'apple', 'mango', 'fig', 'lemon']
newList = []
for fruit in fruits:
    newList.append(fruit.upper())
print(newList)

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)))

2

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 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.


1

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

1

Uma versão muito mais simples da resposta principal é dada aqui por @Amorpheuses.

Com uma lista de valores em val:

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

Isso funcionou bem para mim com uma fonte de texto f = open ().


1

Você pode tentar usar:

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

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

print(list(map(capitalize_list, my_list)))

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)

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)

0

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']
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.