J'ai du code python qui se divise en virgule, mais ne supprime pas l'espace blanc:
>>> string = "blah, lots , of , spaces, here "
>>> mylist = string.split(',')
>>> print mylist
['blah', ' lots ', ' of ', ' spaces', ' here ']
Je préfère me retrouver avec des espaces supprimés comme ceci:
['blah', 'lots', 'of', 'spaces', 'here']
Je suis conscient que je pourrais parcourir la liste et supprimer () chaque élément mais, comme il s'agit de Python, je suppose qu'il existe une manière plus rapide, plus facile et plus élégante de le faire.
python
whitespace
strip
Mr_Chimp
la source
la source
Fractionnez en utilisant une expression régulière. Remarque J'ai rendu le cas plus général avec des espaces de début. La compréhension de la liste consiste à supprimer les chaînes nulles à l'avant et à l'arrière.
Cela fonctionne même si
^\s+
ne correspond pas:Voici pourquoi vous avez besoin de ^ \ s +:
Voir les principaux espaces de bla?
Clarification: ci-dessus utilise l'interpréteur Python 3, mais les résultats sont les mêmes dans Python 2.
la source
[x.strip() for x in my_string.split(',')]
c'est plus pythonique pour la question posée. Il y a peut-être des cas où ma solution est nécessaire. Je mettrai à jour ce contenu si j'en rencontre un.^\s+
nécessaire? J'ai testé votre code sans lui et cela ne fonctionne pas, mais je ne sais pas pourquoi.re.compile("^\s*,\s*$")
, le résultat est[' blah, lots , of , spaces, here ']
.^\s+
fait du. Comme vous pouvez le constater par vous-même,^\s*,\s*$
ne renvoie pas non plus les résultats souhaités. Donc, si vous voulez diviser avec une expression rationnelle, utilisez^\s+|\s*,\s*|\s+$
.Je suis venu ajouter:
map(str.strip, string.split(','))
mais vu qu'il avait déjà été mentionné par Jason Orendorff dans un commentaire .
En lisant le commentaire de Glenn Maynard dans la même réponse suggérant des compréhensions de liste sur la carte, j'ai commencé à me demander pourquoi. Je supposais qu'il voulait dire pour des raisons de performance, mais bien sûr il aurait pu vouloir dire pour des raisons stylistiques, ou autre chose (Glenn?).
Un test rapide (éventuellement imparfait?) Sur ma box appliquant les trois méthodes en boucle a donc révélé:
fabrication
map(str.strip, string.split(','))
le gagnant, même s'il semble qu'ils sont tous dans le même stade.Certes, la carte (avec ou sans lambda) ne doit pas nécessairement être exclue pour des raisons de performances, et pour moi, c'est au moins aussi clair qu'une compréhension de liste.
Éditer:
Python 2.6.5 sur Ubuntu 10.04
la source
Supprimez simplement l'espace blanc de la chaîne avant de le diviser.
la source
"you just, broke this"
.Je sais que cela a déjà été répondu, mais si vous arrêtez de faire beaucoup de choses, les expressions régulières peuvent être une meilleure façon de procéder:
Le
\s
correspond à n'importe quel caractère d'espacement, et nous le remplaçons simplement par une chaîne vide''
. Vous pouvez trouver plus d'informations ici: http://docs.python.org/library/re.html#re.subla source
cela fonctionne bien pour moi.
la source
re
(comme dans les expressions régulières) permet de diviser plusieurs caractères à la fois:Cela ne fonctionne pas bien pour votre exemple de chaîne, mais fonctionne bien pour une liste séparée par des virgules. Pour votre exemple de chaîne, vous pouvez combiner la puissance re.split pour diviser les motifs regex pour obtenir un effet "split-on-this-or-that".
Malheureusement, c'est moche, mais
filter
ça fera l'affaire:Voila!
la source
re.split(' *, *', string)
?re.split('[, ]*',string)
pour le même effet.[, ]*
laisse une chaîne vide à la fin de la liste. Je pense que le filtre est toujours une bonne chose à jeter là-dedans, ou s'en tenir à la compréhension de la liste comme le fait la première réponse.map(lambda s: s.strip(), mylist)
serait un peu mieux qu'une boucle explicite. Ou pour le tout à la fois:map(lambda s:s.strip(), string.split(','))
la source
map
, en particulier si vous l'utilisezlambda
, vérifiez à nouveau si vous devez utiliser une liste de compréhension.map(str.strip, s.split(','))
.la source
Simplement, une virgule ou au moins un espace blanc avec / sans espaces blancs précédents / suivants.
S'il vous plaît essayez!
la source
map(lambda s: s.strip(), mylist)
serait un peu mieux qu'une boucle explicite.Ou pour le tout à la fois:
C'est essentiellement tout ce dont vous avez besoin.
la source