web-dev-qa-db-fra.com

Convertir une liste Python avec des chaînes en minuscules ou majuscules

J'ai une variable de liste python qui contient des chaînes. Existe-t-il une fonction python capable de convertir toutes les chaînes d'un passage en minuscules et vice versa, en majuscules?

214
user219126

Cela peut être fait avec des compréhensions de liste. Celles-ci prennent essentiellement la forme de [function-of-item for item in some-list]. Par exemple, pour créer une nouvelle liste dans laquelle tous les éléments sont en minuscule (ou en majuscule dans le deuxième extrait), vous devez utiliser:

>>> [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']
372
YOU

En plus d'être facile à lire (pour beaucoup de gens), la compréhension de liste gagne aussi la course de vitesse:

$ 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
47
Ned Deily
>>> map(str.lower,["A","B","C"])
['a', 'b', 'c']
32
ghostdog74

La compréhension de la liste, c’est comment je le ferais, c’est la méthode "Pythonic". La transcription suivante montre comment convertir une liste en majuscules puis en bas:

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

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

 $ python -m timeit -s 's = ["un", "deux", "trois"] * 1000 "' [x.upper pour x dans s] '
 1000 boucles, au mieux 3: 809 usec par boucle 
 
 $ python -m timeit -s's = ["un", "deux", " trois "] * 1000" carte (str.upper, s) '
 1000 boucles, meilleur de 3: 1,12 ms par boucle 
 
 $ python -m timeit -s 's = ["un", "deux", "trois"] * 1000 "carte (lambda x: x.upper (), s)' 
 1000 boucles, meilleur de 3 : 1,77 ms par boucle 
6
John La Rooy

un étudiant demande, un autre étudiant avec le même problème répond :))

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

Solution:

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

Cette solution créera une liste séparée contenant les éléments en minuscule, quel que soit leur cas d'origine. Si le cas original est supérieur, le list s contiendra les minuscules de l'élément correspondant dans list p. Si la casse originale de l'élément de liste est déjà minuscule dans list p, le list s conservera la casse de l'élément et le conservera en minuscule. Vous pouvez maintenant utiliser list s au lieu de list p.

2
Sunil
mylist = ['Mixed Case One', 'Mixed Case Two', 'Mixed Three']
print map(lambda x: x.lower(), mylist)
print map(lambda x: x.upper(), mylist)
2
Chirael

Si votre but est de faire correspondre une autre chaîne en convertissant en une passe, vous pouvez également utiliser str.casefold().

Ceci est utile lorsque vous avez des caractères non-ascii et en correspondance avec les versions ascii (par exemple: maße vs masse). Cependant, str.lower ou str.upper échoue dans ces cas-là, str.casefold() passera. Ceci est disponible dans Python 3 et l'idée est discutée en détail avec la réponse 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
Gimhani

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)

Si vous avez besoin d'une chaîne ou d'une liste comme sortie et non d'un itérateur (c'est pour Python3), comparez l'option ''.join(string).upper() à ceci:

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
aerijman