2009-11-26 25 views
136

Ho una variabile lista python che contiene stringhe. Esiste una funzione python in grado di convertire tutte le stringhe in un passaggio in lettere minuscole e viceversa in maiuscolo?Convertire una lista Python con stringhe tutte minuscole o maiuscole

+0

Perché "in un solo passaggio"? Prendi in considerazione la possibilità che faccia più passaggi? –

+21

"in one pass" profuma come il linguaggio dei compiti –

risposta

249

Si può fare con la comprensione delle liste. Questi sostanzialmente 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 minuscolo (o in maiuscolo nel secondo frammento di), si usa:

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

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

È anche possibile utilizzare la funzione map:

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

La funzione mappa funziona come previsto in python2, tuttavia in python3 devi avvolgere la mappa in un elenco ex: 'list (map (lambda x: x.upper(), [" a "," b "," c "]))' –

+3

La seconda proposizione con ** map ** è corretta ma dispendiosa. Non c'è ** nessun punto nel fare una funzione lambda **. Basta usare 'map (str.lower, [" A "," B "," C "])' – fralau

12

La comprensione delle liste è come lo farei, è il modo "Pythonic". La seguente trascrizione mostra come convertire un elenco di tutte le lettere maiuscole poi di nuovo a più bassa:

[email protected]:~$ 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'] 
+0

err, usando 'list' come un nome variabile non è la scelta migliore :) –

+0

No, ma dal nome è di poca importanza per il metodo che viene mostrato, non è davvero rilevante. Tuttavia, cambierò il nome nel caso qualcuno voglia utilizzare il codice così com'è. – paxdiablo

+0

la magia dello stackoverflow: 250 voti per una soluzione solo 2 in pitone usando lambda dove non dovrebbe !! bene 249 ora –

1
mylist = ['Mixed Case One', 'Mixed Case Two', 'Mixed Three'] 
print map(lambda x: x.lower(), mylist) 
print map(lambda x: x.upper(), mylist) 
22
>>> map(str.lower,["A","B","C"]) 
['a', 'b', 'c'] 
+0

ovviamente 'str.upper' per convertire in maiuscolo –

+4

non funzionerà molto bene su stringhe unicode in python 2 – mhawke

39

Oltre ad essere più facile da leggere (per molte persone), list comprehension vincere la gara di velocità, troppo :

$ 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 
+3

Conosci il motivo per cui una comprensione delle liste è più veloce della mappa? – Nixuz

+4

Non è sempre più veloce. Ecco un esempio in cui non lo è: http://stackoverflow.com/questions/1247486/python-list-comprehension-vs-map Ma in questo caso non è * molto * più lento. Usare una lambda fa ovviamente una grande differenza. Ci sono altri esempi del perché è pericoloso fidarsi del proprio intuito su problemi di prestazioni, specialmente in Python. –

+0

in python 3, 'map' vince la gara, ma non fa niente :) –

4

Per questo esempio la comprensione è più veloce

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

$ python -m timeit -s 's=["one","two","three"]*1000' 'map(str.upper,s)' 
1000 loops, best of 3: 1.12 msec per loop 

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

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

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