10
votes

Comment supprimer la liste des mots d'une liste des chaînes

Désolé si la question est un peu déroutante. C'est semblable à Cette question

Je pense que cela La question ci-dessus est proche de ce que je veux, mais à Clojure.

Il y a une autre question < / P>

J'ai besoin de quelque chose comme ça, mais au lieu de "[BR]" dans cette question, il existe une liste de chaînes qui doivent être recherchées et supprimées.

espoir que je me suis fait clairement.

Je pense que cela est dû au fait que les cordes de Python sont immuables.

J'ai une liste de mots de bruit qui doivent être supprimés d'une liste de chaînes.

Si j'utilise la compréhension de la liste, je finis à la recherche de la même chaîne encore et encore. Donc, seulement "de" est supprimé et non "le". Donc, ma liste modifiée ressemble à ceci xxx

J'aimerais savoir quant à l'erreur que je fais.


1 commentaires

Tu ne te fais pas clarifier; Indiquez votre question ici , puis mettez des liens vers des questions similaires avec des réponses similaires si vous pensez que cela est nécessaire ci-dessous.


4 Réponses :


10
votes

Voici mon poignard. Cela utilise des expressions régulières. xxx pré>

sans lambda code>: p> xxx pré>

update strong> p>

Correction du bogue pointé par gnibbler (merci!): P>

pattern = re.compile("\\b(of|the|in|for|at)\\W", re.I)
phrases = ['of New York', 'of the New York', 'Spain has rain']
[pattern.sub("", phrase) for phrase in phrases] # ['New York', 'New York', 'Spain has rain']


4 commentaires

Merci. Cela fonctionne de cette façon. J'ai pu comprendre le concept de Lambda plus clairement maintenant que j'ai eu la chance de mettre en œuvre cela.


Cela ne fonctionne pas correctement pour la phrase "L'Espagne a la pluie". Il est facile de corriger cependant


@Gnibbler: merci de le pointer. Je change ma réponse en conséquence.


J'ai ajouté le mot "max" dans le motif et, dans certains cas, il a supprimé le mot, dans d'autres cas, ce n'est pas le cas. C'est bizarre, quelqu'un devrait le tester pour voir s'ils obtiennent les mêmes résultats.



4
votes
>>> import re
>>> noise_words_list = ['of', 'the', 'in', 'for', 'at']
>>> phrases = ['of New York', 'of the New York']
>>> noise_re = re.compile('\\b(%s)\\W'%('|'.join(map(re.escape,noise_words_list))),re.I)
>>> [noise_re.sub('',p) for p in phrases]
['New York', 'New York']

3 commentaires

Wow! C'est une vraie façon de faire, bien que j'ai tendu mon cerveau. :-)


Cela ne semble pas obtenir chaque instance de mots. Par exemple, "de New York de" devient "New York de".


@Namey, vous pouvez utiliser quelque chose comme '\\ w? \\ b (% s) \\ w?' . Sans l'OP fournissant un ensemble complet de tests, c'est un peu d'une balle-a-mole



1
votes

Depuis que vous souhaitez savoir ce que vous faites de mal, cette ligne: xxx

a lieu, puis commence à boucler sur des mots. Il vérifie d'abord "de". Votre place (par exemple "de la New York") est vérifiée pour voir si elle commence par "de". Il est transformé (appeler pour remplacer et bander) et ajouté à la liste des résultats. La chose cruciale ici est que le résultat n'est plus jamais examiné. Pour chaque mot, vous iTERE dans la compréhension, un nouveau résultat est ajouté à la liste des résultats. Donc, le mot suivant est "The" et ta place ("de la New York") ne commence pas par "le", donc aucun nouveau résultat n'est ajouté.

Je suppose que le résultat que vous avez fini par la concaténation de vos variables de votre place. Une version de procédure plus simple à lire et à comprendre serait (non testée): xxx

garder à l'esprit que remplacer () supprime le mot n'importe où dans le chaîne, même si cela se produit comme une simple sous-chaîne. Vous pouvez éviter cela en utilisant des regexes avec un modèle quelque chose comme ^ le \ b .


1 commentaires

Merci. C'était très utile.



15
votes

Sans Regexp, vous pouvez faire comme ça:

places = ['of New York', 'of the New York']

noise_words_set = {'of', 'the', 'at', 'for', 'in'}
stuff = [' '.join(w for w in place.split() if w.lower() not in noise_words_set)
         for place in places
         ]
print stuff


1 commentaires

Je suis tombé sur ça et je n'avais aucune idée de ce qui se passe ici. Si quelqu'un trébuche à travers cela et me demande quelle magie se passe, sa compréhension de la liste appelée et c'est un bon article qui l'explique carlgoner.me/python/2011/11/09/...