web-dev-qa-db-fra.com

Vérifier si la sous-chaîne est dans une liste de chaînes?

J'ai déjà trouvé des réponses à cette question, mais elles semblent obsolètes pour les versions actuelles de Python (ou du moins, elles ne fonctionnent pas pour moi).

Je veux vérifier si une sous-chaîne est contenue dans une liste de chaînes. Je n'ai besoin que du résultat booléen.

J'ai trouvé cette solution:

Word_to_check = 'or'
wordlist = ['yellow','orange','red']

result = any(Word_to_check in Word for Word in worldlist)

De ce code, je m'attendrais à obtenir une valeur True. Si le mot était "der", alors le résultat devrait être False.

Cependant, le résultat est une fonction génératrice et je ne trouve pas de moyen d'obtenir la valeur True.

Une idée?

33
Álvaro

Vous pouvez importer any à partir de __builtin__ s'il a été remplacé par un autre any:

>>> from  __builtin__ import any as b_any
>>> lst = ['yellow', 'orange', 'red']
>>> Word = "or"
>>> b_any(Word in x for x in lst)
True

Notez que dans Python 3, __builtin__ a été renommé en builtins.

26

Le code que vous avez publié en utilisant any () est correct et devrait fonctionner à moins que vous ne le redéfinissiez quelque part.

Cela dit, il existe une solution simple et rapide en utilisant la recherche de sous-chaîne sur une seule chaîne combinée:

>>> wordlist = ['yellow','orange','red']
>>> combined = '\t'.join(wordlist)

>>> 'or' in combined
True
>>> 'der' in combined
False

Cela devrait fonctionner beaucoup plus rapidement que l’approche utilisant any . Le caractère de jointure peut être n'importe quel caractère qui ne figure pas dans l'un des mots de la liste de mots.

25

Vous pouvez utiliser next à la place:

colors = ['yellow', 'orange', 'red'] 
search = "or"

result = next((True for color in colors if search in color), False)

print(result) # True

Pour afficher la chaîne contenant la sous-chaîne:

colors = ['yellow', 'orange', 'red'] 
search = "or"

result = [color for color in colors if search in color]  

print(result) # Orange
6
stderr

Aussi, si quelqu'un veut vérifier si l'une des valeurs d'un dictionnaire existe en tant que sous-chaîne dans une liste de chaînes, peut utiliser ceci:

list_a = [
    'Copy of snap-009ecf9feb43d902b from us-west-2',
    'Copy of snap-0fe999422014504b6 from us-west-2',
    'Copy of snap-0fe999422014cscx504b6 from us-west-2',
    'Copy of snap-0fe999422sdad014504b6 from us-west-2'
]
dict_b = {
    '/dev/xvda': 'snap-0fe999422014504b6',
    '/dev/xvdsdsa': 'snap-sdvcsdvsdvs'
}

for b1 in dict_b.itervalues():
    result = next( ("found" for a1 in a if b1 in a1), "not found")
    print result 

Il imprime

not found
found
0
Kostas Demiris