¿Cómo puedo verificar si alguna de las cadenas de una matriz existe en otra cadena?
Me gusta:
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"
Ese código no funciona, es solo para mostrar lo que quiero lograr.

[abc]también funciona perfectamente bien y será más rápido si hay más de un par de candidatos para evaluar. Pero si las cadenas son arbitrarias y no las conoce de antemano para construir una expresión regular, tendrá que usar elany(x in str for x in a)enfoque.Respuestas:
Puedes usar
any:De manera similar, para verificar si se encuentran todas las cadenas de la lista, use en
alllugar deany.fuente
for x in acomo "para cada elemento de la lista". Dado queaes una lista de cadenas, yxes un elemento de esa lista,xes una cadena (una de 'a', 'b', 'c' en el ejemplo original)any()es, con mucho, el mejor enfoque si todo lo que quiere esTrueoFalse, pero si desea saber específicamente qué cadena / cadenas coinciden, puede usar un par de cosas.Si desea la primera coincidencia (con el
Falsevalor predeterminado):Si desea obtener todas las coincidencias (incluidos los duplicados):
Si desea obtener todas las coincidencias no duplicadas (sin tener en cuenta el orden):
Si desea obtener todas las coincidencias no duplicadas en el orden correcto:
fuente
OrderedDictes probablemente más eficaz que una lista. Vea esta respuesta en "Eliminar duplicados en listas"Debe tener cuidado si las cuerdas entran
aostrse alargan. Las soluciones directas toman O (S * (A ^ 2)), dondeSes la longitud destry A es la suma de las longitudes de todas las cadenasa. Para una solución más rápida, mire el algoritmo Aho-Corasick para la coincidencia de cadenas, que se ejecuta en tiempo lineal O (S + A).fuente
Solo para agregar algo de diversidad con
regex:o si tu lista es demasiado larga
any(re.findall(r'|'.join(a), str, re.IGNORECASE))fuente
(o*esto falla, ya que se debe citar la sintaxis de expresiones regulares.'|'.join(map(re.escape, strings_to_match)). Probablementere.compile('|'.join(...))también deberías .Necesita iterar sobre los elementos de a.
fuente
jbernadas ya mencionó el algoritmo Aho-Corasick-Algoritmo para reducir la complejidad.
Aquí hay una forma de usarlo en Python:
Descargue aho_corasick.py desde aquí
Póngalo en el mismo directorio que su archivo Python principal y asígnele un nombre
aho_corasick.pyPruebe el alroritmo con el siguiente código:
Tenga en cuenta que la búsqueda distingue entre mayúsculas y minúsculas
fuente
fuente
Depende del contexto supongo que si usted quiere comprobar sola literal como (palabra única a, e, w, etc ..) en es suficiente
si desea verificar cualquiera de los caracteres entre la palabra original: utilice
si desea toda la entrada que desea en esa palabra_original, utilice todos los simples
fuente
Solo un poco más de información sobre cómo obtener todos los elementos de la lista disponibles en String
fuente
Un enfoque sorprendentemente rápido es usar
set:Esto funciona si
ano contiene ningún valor de caracteres múltiples (en cuyo caso, useanycomo se menciona anteriormente ). Si es así, es más sencillo para especificaracomo una cadena:a = 'abc'.fuente
fuente
Usaría este tipo de función para la velocidad:
fuente
fuente