2009-11-26 7 views

Répondre

249

Cela peut être fait avec des listes compréhensibles. Ceux-ci prennent essentiellement la forme de [function-of-item for item in some-list]. Par exemple, pour créer une nouvelle liste où tous les éléments sont en minuscules (ou tubé supérieure dans le second extrait), vous utilisez:

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

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

Vous pouvez également utiliser la fonction 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 fonction de la carte fonctionne comme prévu dans python2, mais dans python3 vous pouvez envelopper la carte dans une liste ex: 'list (map (lambda x: x.upper(), [" a "," b "," c "]))' –

+3

Deuxième proposition avec ** carte ** est correcte mais inutile. Il n'y a aucun intérêt à faire une fonction lambda **. Il suffit d'utiliser 'map (str.lower, [" A "," B "," C "])' – fralau

12

La compréhension de liste est comment je le ferais, c'est la manière "Pythonic". La transcription ci-dessous montre comment convertir une liste à tous les majuscules puis de nouveau à bas:

[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, en utilisant 'list' comme nom de variable n'est pas le meilleur choix :) –

+0

Non mais, depuis le nom est peu important pour la méthode montrée, ce n'est pas vraiment pertinent. Cependant, je vais changer le nom au cas où quelqu'un voudrait utiliser le code tel quel. – paxdiablo

+0

la magie de stackoverflow: 250 votes pour une solution python 2-only utilisant lambda où elle ne devrait pas !! Eh bien, maintenant 249 –

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

évidemment 'str.upper' pour convertir en majuscule –

+4

ne fonctionnera pas trop bien sur les chaînes unicode en python 2 – mhawke

39

En plus d'être plus facile à lire (pour beaucoup de gens), compréhensions liste gagner la course de vitesse, trop :

$ 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

Savez-vous la raison derrière pourquoi une compréhension de la liste est plus rapide que la carte? – Nixuz

+4

Ce n'est pas toujours plus rapide. Voici un exemple où ce n'est pas: http://stackoverflow.com/questions/1247486/python-list-comprehension-vs-map Mais ce n'est pas * beaucoup * plus lent dans ce cas. L'utilisation d'un lambda fait évidemment une grande différence. Il y a plus d'exemples de pourquoi il est dangereux de faire confiance à votre intuition sur les problèmes de performance, en particulier en Python. –

+0

en python 3, 'map' gagne la course, mais ne fait rien :) –

4

Pour cet échantillon, la compréhension est la plus rapide

 
$ 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

un étudiant demandant, un autre étudiant avec le même problème répondant :))

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