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']
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
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
évidemment str.upperpour se convertir en majuscules
John La Rooy
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
Python3.5.2(default,Nov172016,17:05:23)[GCC 5.4.020160609] 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']
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
>>> s =[]>>> p =['This','That','There','is','apple']>>>[s.append(i.lower())ifnot 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.
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
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)
Réponses:
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:Vous pouvez également utiliser la
map
fonction:la source
list(map(lambda x:x.upper(),["a","b","c"]))
map(str.lower, ["A","B","C"])
En plus d'être plus faciles à lire (pour beaucoup de gens), les listes de compréhension gagnent aussi la course de vitesse:
la source
map
gagne la course, mais ne fait rien :)map(str.lower,["A","B","C"])
est le plus rapide est python3.7.5la source
str.upper
pour se convertir en majusculesLa 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:
la source
list
comme nom de variable n'est pas le meilleur choix :)list
trucs :)) D'où pensez-vous que les UV que vous avez récemment obtenus viennent? :)Pour cet exemple, la compréhension est la plus rapide
la source
un étudiant demande, un autre étudiant avec le même problème répond :))
la source
la source
Solution:
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 s
contenu contiendra des minuscules de l'élément respectif danslist p
. Si la casse d'origine de l'élément de liste est déjà en minuscules,list p
lelist s
conserve la casse de l'élément et la conserve en minuscules. Vous pouvez maintenant utiliser à lalist s
place delist p
.la source
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.lower
oustr.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 .la source
Une version beaucoup plus simple de la première réponse est donnée ici par @Amorpheuses.
Avec une liste de valeurs dans val:
Cela a bien fonctionné pour moi avec une source de texte f = open ().
la source
Vous pouvez essayer d'utiliser:
la source
Python3.6.8
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:la source
Si vous essayez de convertir toutes les chaînes en minuscules dans la liste, vous pouvez utiliser des pandas:
production:
la source