Comment puis-je vérifier si l'une des chaînes d'un tableau existe dans une autre chaîne?
Comme:
a = ['a', 'b', 'c']
str = "a123"
if a in str:
print "some of the strings found in str"
else:
print "no strings found in str"
Ce code ne fonctionne pas, c'est juste pour montrer ce que je veux réaliser.
any()
est de loin la meilleure approche si tout ce que vous voulez est True
ou False
, mais si vous voulez savoir précisément quelle chaîne correspond, vous pouvez utiliser plusieurs choses.
Si vous voulez la première correspondance (avec False
par défaut):
match = next((x for x in a if x in str), False)
Si vous souhaitez obtenir toutes les correspondances (y compris les doublons):
matches = [x for x in a if x in str]
Si vous souhaitez obtenir toutes les correspondances non dupliquées (sans tenir compte de l'ordre):
matches = {x for x in a if x in str}
Si vous voulez obtenir toutes les correspondances sans doublons dans le bon ordre:
matches = []
for x in a:
if x in str and x not in matches:
matches.append(x)
Soyez prudent si les chaînes dans a
ou str
deviennent plus longues. Les solutions simples prennent O (S * (A ^ 2)), où S
est la longueur de str
et A est la somme des longueurs de toutes les chaînes de a
. Pour une solution plus rapide, regardez Aho-Corasick algorithme de correspondance des chaînes, qui s'exécute en temps linéaire O (S + A).
Juste pour ajouter de la diversité avecregex
:
import re
if any(re.findall(r'a|b|c', str, re.IGNORECASE)):
print 'possible matches thanks to regex'
else:
print 'no matches'
ou si votre liste est trop longue - any(re.findall(r'|'.join(a), str, re.IGNORECASE))
Vous devez parcourir les éléments de a.
a = ['a', 'b', 'c']
str = "a123"
found_a_string = False
for item in a:
if item in str:
found_a_string = True
if found_a_string:
print "found a match"
else:
print "no match found"
a = ['a', 'b', 'c']
str = "a123"
a_match = [True for match in a if match in str]
if True in a_match:
print "some of the strings found in str"
else:
print "no strings found in str"
jbernadas a déjà mentionné le Aho-Corasick-Algorithm afin de réduire la complexité.
Voici une façon de l'utiliser en Python:
Téléchargez aho_corasick.py depuis ici
Placez-le dans le même répertoire que votre fichier Python principal et nommez-le aho_corasick.py
Essayez l'alrorithm avec le code suivant:
from aho_corasick import aho_corasick #(string, keywords)
print(aho_corasick(string, ["keyword1", "keyword2"]))
Notez que la recherche est sensible à la casse
Cela dépend du contexte. Supposez si vous voulez vérifier un seul littéral comme (n'importe quel mot simple a, e, w, etc.) in est suffisant
original_Word ="hackerearcth"
for 'h' in original_Word:
print("YES")
si vous voulez vérifier l’un des caractères parmi les caractères originaux: utilisez
if any(your_required in yourinput for your_required in original_Word ):
si vous voulez toute l'entrée que vous voulez dans cet original_Word, utilisez tout simple
original_Word = ['h', 'a', 'c', 'k', 'e', 'r', 'e', 'a', 'r', 't', 'h']
yourinput = str(input()).lower()
if all(requested_Word in yourinput for requested_Word in original_Word):
print("yes")
Je voudrais utiliser ce genre de fonction pour la vitesse:
def check_string(string, substring_list):
for substring in substring_list:
if substring in string:
return True
return False
data = "firstName and favoriteFood"
mandatory_fields = ['firstName', 'lastName', 'age']
# for each
for field in mandatory_fields:
if field not in data:
print("Error, missing req field {0}".format(field));
# still fine, multiple if statements
if ('firstName' not in data or
'lastName' not in data or
'age' not in data):
print("Error, missing a req field");
# not very readable, list comprehension
missing_fields = [x for x in mandatory_fields if x not in data]
if (len(missing_fields)>0):
print("Error, missing fields {0}".format(", ".join(missing_fields)));
Quelques informations supplémentaires sur la façon d'obtenir tous les éléments de liste disponibles dans String
a = ['a', 'b', 'c']
str = "a123"
list(filter(lambda x: x in str, a))
Une approche étonnamment rapide consiste à utiliser set
:
a = ['a', 'b', 'c']
str = "a123"
if set(a) & set(str):
print("some of the strings found in str")
else:
print("no strings found in str")
Cela fonctionne si a
ne contient aucune valeur de plusieurs caractères (auquel cas, utilisez any
tel qu'énuméré ci-dessus ). Si c'est le cas, il est plus simple de spécifier a
en tant que chaîne: a = 'abc'
.