Si tengo needle
hilo y quiero comprobar si existe de forma contigua como subcadena en el haystack
, puedo usar:
if needle in haystack: ...
¿Qué puedo usar en el caso de una subsecuencia no continua? Ejemplo:
>>> haystack = "abcde12345" >>> needle1 = "ace13" >>> needle2 = "123abc" >>> is_subsequence(needle1, haystack) True >>> is_subsequence(needle2, haystack) # order is important! False
No sé si hay una función incorporada, pero es bastante simple de hacer manualmente
def exists(a, b): """checks if b exists in a as a subsequence""" pos = 0 for ch in a: if pos < len(b) and ch == b[pos]: pos += 1 return pos == len(b)
>>> exists("moo", "mo") True >>> exists("moo", "oo") True >>> exists("moo", "ooo") False >>> exists("haystack", "hack") True >>> exists("haystack", "hach") False >>>
Usando un truco iterador:
it = iter(haystack) all(x in it for x in needle)
Esta es solo una versión concisa de la misma idea presentada en otra respuesta .
Otra posibilidad: puede crear iteradores para ambos, aguja y pajar, y luego hacer estallar elementos desde el pajar-iterador hasta que se encuentren todos los caracteres de la aguja, o se agote el iterador.
def is_in(needle, haystack): try: iterator = iter(haystack) for char in needle: while next(iterator) != char: pass return True except StopIteration: return False