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


261

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


Pourquoi "en un seul passage"? Envisagez-vous la possibilité de faire plusieurs passes?
John Machin

Quelle doit être la sortie?
O.rka

Réponses:


440

Cela peut être fait avec des listes de compréhension. Celles-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 en majuscules dans le deuxième extrait), vous utiliseriez:

>>> [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 mapfonction:

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

12
La fonction de carte fonctionne comme prévu en python2, cependant en python3 vous devez envelopper la carte dans une liste ex:list(map(lambda x:x.upper(),["a","b","c"]))
Tom S

39
La deuxième proposition avec la carte est correcte mais inutile. Il est inutile de créer une fonction lambda . Il suffit d'utilisermap(str.lower, ["A","B","C"])
fralau

1
Lorsque j'essaie d'imprimer une liste après cet appel, rien ne change. Pourquoi donc?
imite le

1
@mimic Un peu en retard, mais pour les personnes qui rencontrent cela, je suppose que votre problème était probablement que vous n'attribuiez pas le résultat de la compréhension de la liste à votre liste. Le simple fait de comprendre la liste renvoie la valeur, mais ne la réaffecte pas à la variable de liste.
Michael Kolber

52

En plus d'être plus faciles à lire (pour beaucoup de gens), les listes de compréhension gagnent 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

4
Connaissez-vous la raison pour laquelle la compréhension d'une liste est plus rapide que la carte?
Nixuz

6
Ce n'est pas toujours plus rapide. Voici un exemple où ce n'est pas le cas: stackoverflow.com/questions/1247486/… 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 performances, en particulier en Python.
Ned Deily

3
en python 3, mapgagne la course, mais ne fait rien :)
Jean-François Fabre

@NedDeily map(str.lower,["A","B","C"])est le plus rapide est python3.7.5
SHIVAM JINDAL


20

La compréhension de la liste est la façon dont je le ferais, c'est la manière "Pythonique". 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']

2
euh, utiliser listcomme nom de variable n'est pas le meilleur choix :)
Jean-François Fabre

Non, mais comme le nom a peu d'importance pour la méthode affichée, il n'est pas vraiment pertinent. Cependant, je changerai le nom au cas où quelqu'un voudrait utiliser le code tel quel.
paxdiablo

la magie du stackoverflow: 250 votes pour une solution python 2 uniquement utilisant lambda là où ça ne devrait pas !! puits 249 maintenant
Jean-François Fabre

@ Jean-FrançoisFabre, je ne sais pas pourquoi vous pensez que c'est une solution uniquement en Python-2. Comme le montrent les transcriptions, il fonctionne clairement sous Python 3.5.2. En fait, je viens de le vérifier à nouveau pour confirmation. ... un certain temps passe pendant que j'enquête ... En fait, peu importe, il semble que vous parliez de la réponse actuellement acceptée plutôt que de celle-ci, donc vous devriez probablement faire des commentaires là-bas plutôt qu'ici. Sans doute une erreur honnête. À votre santé.
paxdiablo

1
oui, je ne critiquais pas le vôtre (à part les listtrucs :)) D'où pensez-vous que les UV que vous avez récemment obtenus viennent? :)
Jean-François Fabre

7

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

$ python -m timeit -s 's = ["un", "deux", "trois"] * 1000' '[x.upper pour x en s]'
1000 boucles, meilleur de 3: 809 usec par boucle

$ python -m timeit -s 's = ["un", "deux", "trois"] * 1000' 'map (str.upper, s)'
1000 boucles, meilleur de 3: 1,12 ms par boucle

$ python -m timeit -s 's = ["un", "deux", "trois"] * 1000' 'map (lambda x: x.upper (), s)'
1000 boucles, meilleur de 3: 1,77 msec par boucle

5

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)

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

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 minuscules, quel que soit leur cas d'origine. Si le boîtier d'origine est supérieur, le list scontenu contiendra des minuscules de l'élément respectif dans list p. Si la casse d'origine de l'élément de liste est déjà en minuscules, list ple list sconserve la casse de l'élément et la conserve en minuscules. Vous pouvez maintenant utiliser à la list splace de list p.


1

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

Ceci est utile lorsque vous avez des caractères non-ascii et que vous les associez à des versions ascii (par exemple: maße vs masse). Bien que cela échoue str.lowerou str.upperéchoue dans ce cas, 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

Une version beaucoup plus simple de la première réponse est donnée ici par @Amorpheuses.

Avec une liste de valeurs dans val:

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

Cela a bien fonctionné pour moi avec une source de texte f = open ().


1

Vous pouvez essayer d'utiliser:

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)

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' ''.join(string).upper()option à 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

Si vous essayez de convertir toutes les chaînes en minuscules dans la liste, vous pouvez utiliser des pandas:

import pandas as pd

data = ['Study', 'Insights']

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

production:

['study', 'insights']
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.