Converti un elenco Python con stringhe tutte in minuscolo o maiuscolo


261

Ho una variabile di elenco Python che contiene stringhe. Esiste una funzione Python in grado di convertire tutte le stringhe in un passaggio in minuscolo e viceversa, in maiuscolo?


Perché "in un passaggio"? Consideri la possibilità che prenda più passaggi?
John Machin,

Cosa deve essere l'output?
O.rka,

Risposte:


440

Può essere fatto con la comprensione dell'elenco. Questi fondamentalmente prendono la forma di [function-of-item for item in some-list]. Ad esempio, per creare un nuovo elenco in cui tutti gli elementi sono in maiuscolo (o maiuscolo nel secondo snippet), è necessario utilizzare:

>>> [x.lower() for x in ["A","B","C"]]
['a', 'b', 'c']

>>> [x.upper() for x in ["a","b","c"]]
['A', 'B', 'C']

Puoi anche usare la mapfunzione:

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

12
La funzione della mappa funziona come previsto in python2, tuttavia in python3 è necessario racchiudere la mappa in un elenco, ad esempio:list(map(lambda x:x.upper(),["a","b","c"]))
Tom S

39
La seconda proposta con la mappa è corretta ma dispendiosa. Non ha senso fare una funzione lambda . Basta usaremap(str.lower, ["A","B","C"])
fralau il

1
Quando provo a stampare un elenco dopo questa chiamata non cambia nulla. Perché?
imita il

1
@mimic Un po 'in ritardo, ma per le persone che si imbattono in questo, suppongo che il tuo problema fosse probabilmente che non stavi assegnando il risultato della comprensione dell'elenco al tuo elenco. Il solo fatto di comprendere l'elenco restituisce il valore, ma non lo riassegna alla variabile elenco.
Michael Kolber,

52

Oltre ad essere più facile da leggere (per molte persone), le comprensioni dell'elenco vincono anche la gara di velocità:

$ 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
Conoscete il motivo per cui una comprensione dell'elenco è più veloce della mappa?
Nixuz,

6
Non è sempre più veloce. Ecco un esempio in cui non lo è: stackoverflow.com/questions/1247486/… Ma in questo caso non è molto più lento. L'uso di una lambda ovviamente fa una grande differenza. Ci sono altri esempi del motivo per cui è pericoloso fidarsi dell'intuizione sui problemi di prestazione, specialmente in Python.
Ned Deily,

3
in Python 3, mapvince la gara, ma non fa nulla :)
Jean-François Fabre

@NedDeily map(str.lower,["A","B","C"])è il più veloce è python3.7.5
SHIVAM JINDAL il


20

La comprensione dell'elenco è come lo farei, è il modo "Pythonic". La seguente trascrizione mostra come convertire un elenco in maiuscolo e poi in maiuscolo:

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, usare listcome nome variabile non è la scelta migliore :)
Jean-François Fabre

No, ma dato che il nome ha poca importanza per il metodo mostrato, non è molto rilevante. Tuttavia, cambierò il nome nel caso qualcuno voglia usare il codice così com'è.
paxdiablo

la magia di StackOverflow: 250 voti per una soluzione solo per Python 2 usando lambda dove non dovrebbe !! bene 249 ora
Jean-François Fabre

@ Jean-FrançoisFabre, non so perché pensi che questa sia una soluzione solo per Python-2. Come mostrano le trascrizioni, è chiaramente in esecuzione in Python 3.5.2. In realtà, ho appena controllato di nuovo per la conferma. ... passa un po 'di tempo mentre indago ... In realtà, non importa, sembra che stavi parlando dell'attuale risposta accettata piuttosto che di questa, quindi probabilmente dovresti commentare piuttosto che qui. Senza dubbio un errore onesto. Saluti.
paxdiablo

1
sì, non stavo criticando la tua (a parte le listcose :)). Da dove pensi che provenga l'ultravioletto di recente? :)
Jean-François Fabre

7

Per questo esempio la comprensione è più veloce

$ python -m timeit -s 's = ["one", "two", "three"] * 1000' '[x.upper per x in s]'
1000 loop, meglio di 3: 809 usec per loop

$ python -m timeit -s 's = ["one", "two", "three"] * 1000' 'map (str.upper, s)'
1000 loop, meglio di 3: 1,12 msec per loop

$ python -m timeit -s 's = ["one", "two", "three"] * 1000' 'map (lambda x: x.upper (), s)'
1000 loop, meglio di 3: 1,77 msec per loop

5

uno studente che chiede, un altro studente con lo stesso problema a rispondere :))

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

Soluzione:

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

Questa soluzione creerà un elenco separato contenente gli elementi minuscoli, indipendentemente dal loro caso originale. Se la custodia originale è in alto list s, conterrà la lettera minuscola del rispettivo elemento in list p. Se il caso originale dell'elemento dell'elenco è già in minuscolo, list pallora list smanterrà il caso dell'elemento e lo manterrà in minuscolo. Ora puoi usare list sinvece di list p.


1

Se il tuo scopo è quello di abbinare un'altra stringa convertendoti in un passaggio, puoi anche usare str.casefold().

Ciò è utile quando si hanno caratteri non ascii e la corrispondenza con le versioni ascii (ad es. Maße vs masse). Anche str.lowerse str.upperin questi casi passerà o fallirà str.casefold(). Questo è disponibile in Python 3 e l'idea è discussa in dettaglio con la risposta 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

Una versione molto più semplice della risposta principale è data qui da @Amorpheuses.

Con un elenco di valori in val:

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

Questo ha funzionato bene per me con una fonte di testo f = open ().


1

Puoi provare a usare:

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 hai bisogno di una stringa o di un elenco come output e non di un iteratore (questo è per Python3), confronta l' ''.join(string).upper()opzione con questa:

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 stai cercando di convertire tutte le stringhe in minuscolo nell'elenco, puoi usare i panda:

import pandas as pd

data = ['Study', 'Insights']

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

produzione:

['study', 'insights']
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.