Séparés par des virgules et de suppression des espaces en Python
J'ai peu de code python qui se divise sur la virgule, mais n'a pas de bande de l'espace:
>>> string = "blah, lots , of , spaces, here "
>>> mylist = string.split(',')
>>> print mylist
['blah', ' lots ', ' of ', ' spaces', ' here ']
Je préfère finir avec un espace retiré comme ceci:
['blah', 'lots', 'of', 'spaces', 'here']
Je suis conscient que je pourrais faire une boucle par la liste et strip() de chaque élément, mais, comme c'est le Python, je devine qu'il y a de plus rapide, plus facile et plus élégante façon de faire.
Vous devez vous connecter pour publier un commentaire.
Utiliser compréhension de liste-simple, et tout aussi facile à lire comme une
for
boucle.Voir: Python docs sur la Compréhension de Liste
Un bon 2 deuxième explication de la compréhension de liste.
Split à l'aide d'une expression régulière. Remarque j'ai fait le cas le plus général, avec de grands espaces. La compréhension de liste est de supprimer les chaînes vides à l'avant et à l'arrière.
Cela fonctionne même si
^\s+
ne correspond pas:Voici pourquoi vous avez besoin d' ^\s+:
Voir les principaux espaces bla?
Précisions: ci-dessus utilise l'interpréteur Python 3, mais les résultats sont les mêmes en Python 2.
[x.strip() for x in my_string.split(',')]
est plus pythonic pour la question posée. Peut-être il ya des cas où ma solution est nécessaire. Je vais mettre à jour ce contenu, si je rencontre un.^\s+
nécessaire? J'ai testé ton code et ça ne fonctionne pas, mais je ne sais pas pourquoi.re.compile("^\s*,\s*$")
, le résultat est[' blah, lots , of , spaces, here ']
.^\s+
fait. Comme vous pouvez le voir par vous-même,^\s*,\s*$
ne retourne pas les résultats escomptés, soit. Donc, si vous voulez diviser avec une regexp, l'utilisation^\s+|\s*,\s*|\s+$
.re.split('\s*,\s*', " blah, lots , of , spaces, here ".strip())
retourne['blah', 'lots', 'of', 'spaces', 'here']
et évite les cas particuliers dans l'expression régulière.re.split(r"[^\w']+", input.strip())
pour le fractionnement sur autre chose que la parole des personnages et de l'apostrophe.re.split("[ ,]+", input.strip())
pour le fractionnement sur les espaces et les virgules. Les deux consommer plusieurs "split" de caractères, donc il n'y a pas de chaînes vides dans la sortieJe suis venu ajouter:
map(str.strip, string.split(','))
mais vu qu'il avait déjà été mentionné par Jason Orendorff dans un commentaire.
Lecture Glenn Maynard commentaire dans la même réponse, ce qui suggère interprétations de la liste sur la carte j'ai commencé à me demander pourquoi. Je suppose qu'il voulait dire pour des raisons de performances, mais bien sûr, il aurait peut-être signifiait pour des raisons de style, ou quelque chose d'autre (Glenn?).
Rapidement (éventuellement défectueux?) test sur ma boîte de l'application des trois méthodes dans une boucle a révélé:
faire
map(str.strip, string.split(','))
le vainqueur, bien qu'il semble qu'ils sont tous dans le même stade.Certainement si la carte (avec ou sans lambda) ne doit pas nécessairement être écartée pour des raisons de performances, et pour moi, il est au moins aussi clair qu'une compréhension de liste.
Edit:
Python 2.6.5 sur Ubuntu 10.04
Il suffit de supprimer l'espace blanc de la chaîne avant de le découper.
"you just, broke this"
.Je sais que cela a déjà été répondu, mais si jamais vous avez à faire beaucoup, les expressions régulières peuvent être une meilleure façon d'aller:
La
\s
correspond à tout caractère d'espacement, et nous venons de le remplacer par une chaîne vide''
. Vous pouvez trouver plus d'infos ici: http://docs.python.org/library/re.html#re.subcela fonctionne très bien pour moi.
re
(comme dans les expressions régulières) permet de répartir sur plusieurs personnages à la fois:Cela ne fonctionne pas bien pour ton exemple de la chaîne, mais fonctionne très bien pour une virgule-liste séparée par des espaces. Pour votre exemple de chaîne, vous pouvez combiner les ré.split pouvoir de se diviser sur les modèles regex pour obtenir un "split-sur-cette-ou-" en.
Malheureusement, c'est moche, mais une
filter
fera l'affaire:Voila!
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 belle chose à jeter là-dedans, ou bâton à la compréhension de liste comme le sommet réponse ne.map(lambda s: s.strip(), mylist)
serait un peu mieux que d'être explicitement en boucle. Ou pour l'ensemble de la chose à la fois:map(lambda s:s.strip(), string.split(','))
map
, en particulier si vous utilisezlambda
avec elle, la double vérification pour voir si vous devriez être à l'aide d'une compréhension de liste.map(str.strip, s.split(','))
.Simplement par des virgules, ou au moins l'un des espaces blancs avec/sans précédent/le succès des espaces blancs.
S'il vous plaît essayer!
map(lambda s: s.strip(), mylist)
serait un peu mieux que d'être explicitement en boucle.Ou pour l'ensemble de la chose à la fois:
C'est en gros tout ce dont vous avez besoin.