3
votes

Comment rechercher un mot-clé dans une liste de chaînes et renvoyer cette chaîne?

J'ai une liste de chaînes de quelques mots, et je dois rechercher deux mots-clés et renvoyer les chaînes contenant ces deux mots clés.

J'ai essayé de parcourir les chaînes en boucle, mais pas en mesure de le faire. J'ai essayé la fonction .find () mais cela n'a pas réussi sur une liste de chaînes.

Disons que nous avons une liste:

list_new = ["The man walked the dog", "The man has a brown dog"]

Je le ferais aiment parcourir la liste des chaînes et renvoyer les chaînes dans une nouvelle liste contenant à la fois les mots «homme» et «chien». Idéalement, pour obtenir ce qui suit:

list = ["The man walked the dog", "The lady walked the dog","Dogs 
are cool", "Cats are interesting creatures", "Cats and Dogs was an 
interesting movie", "The man has a brown dog"]


1 commentaires

L'une des réponses ci-dessous résout votre problème? Si c'est le cas, marquez la réponse que vous trouvez la meilleure comme acceptée. Étant donné que vous semblez être nouveau dans Stack Overflow, vous devriez lire Que dois-je faire lorsque quelqu'un répond à ma question?


3 Réponses :


8
votes

Essayez ceci:

['The man walked the dog', 'The man has a brown dog']

OUTPUT :

list_ = ["The man walked the dog", "The lady walked the dog","Dogs are cool", "Cats are interesting creatures", "Cats and Dogs was an interesting movie", "The man has a brown dog"]
l1 = [k for k in list_ if 'man' in k and 'dog' in k]

Remarque: évitez d'attribuer un nom de variable comme liste .


0 commentaires

1
votes

Essayez ceci:

['The man walked the dog', 'The man has a brown dog']

donne

words = ["man", "dog"]
l = ["The man walked the dog", "The lady walked the dog","Dogs are cool", "Cats are interesting creatures", "Cats and Dogs was an interesting movie", "The man has a brown dog"]
new_list = [item for item in l if all((word in item) for word in words)]

(je n'ai pas utilisé le nom list depuis qui masquerait le type intégré.)


0 commentaires

2
votes

J'utiliserais une regex pour éviter les correspondances avec des mots comme manifold ou dogma:

import re

l = [
    "The man walked the dog", 
    "The lady walked the dog", 
    "Dogs are cool", 
    "Cats are interesting creatures",
    "Cats and Dogs was an interesting movie", 
    "The man has a brown dog",
    "the manner dogma"
]

words = ["man", "dog"]
results = [x for x in l if all(re.search("\\b{}\\b".format(w), x) for w in words)]
results

>>> ['The man walked the dog', 'The man has a brown dog']


3 commentaires

Une expression régulière plus complexe vous permettrait également de supprimer la ponctuation. e. g. «L'homme a promu le chien.


cette expression régulière correspond à «chien» dans votre exemple. Pensez-vous que cela ne devrait pas?


Je ne m'attendais pas à ce que «\\ b» corresponde à la ponctuation. J'ai appris quelque chose de nouveau. Merci