Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

431
Vistas
Cómo recuperar coincidencias parciales de una lista de cadenas

Para obtener información sobre cómo recuperar coincidencias parciales en una lista numérica , vaya a:

  • ¿Cómo devolver un subconjunto de una lista que coincide con una condición?

  • Python: Buscar en la lista


Pero si está buscando cómo recuperar coincidencias parciales para una lista de cadenas , encontrará los mejores enfoques explicados de manera concisa en la respuesta a continuación.

SO: la búsqueda de lista de Python con coincidencia parcial muestra cómo devolver un bool , si una list contiene un elemento que coincide parcialmente (p. ej., begins , ends o contains ) una determinada cadena. Pero, ¿cómo puede devolver el elemento en sí , en lugar de True o False ?

Ejemplo:

 l = ['ones', 'twos', 'threes'] wanted = 'three'

Aquí, el enfoque en la pregunta vinculada devolverá True usando:

 any(s.startswith(wanted) for s in l)

Entonces, ¿cómo puede devolver el elemento 'threes' en su lugar?

over 4 years ago · Hanz Gallego
5 Respuestas
Responde la pregunta

0

  • startswith con y in , devuelve un valor booleano.
  • El operador in es una prueba de pertenencia.
  • Esto se puede realizar con una list-comprehension o un filter .
  • Usar list-comprehension , con in , es la implementación más rápida probada.
  • Si el caso no es un problema, considere asignar todas las palabras a minúsculas.
    • l = list(map(str.lower, l)) .
  • Probado con Python 3.10.0

filter :

  • El uso de filter crea un objeto de filter , por lo que list() se usa para mostrar todos los valores coincidentes en una list .
 l = ['ones', 'twos', 'threes'] wanted = 'three' # using startswith result = list(filter(lambda x: x.startswith(wanted), l)) # using in result = list(filter(lambda x: wanted in x, l)) print(result) [out]: ['threes']

list-comprehension

 l = ['ones', 'twos', 'threes'] wanted = 'three' # using startswith result = [v for v in l if v.startswith(wanted)] # using in result = [v for v in l if wanted in v] print(result) [out]: ['threes']

¿Qué implementación es más rápida?

  • Probado en Jupyter Lab usando el corpus de words de nltk v3.6.5 , que tiene 236736 palabras
  • Palabras con 'three'
    • ['three', 'threefold', 'threefolded', 'threefoldedness', 'threefoldly', 'threefoldness', 'threeling', 'threeness', 'threepence', 'threepenny', 'threepennyworth', 'threescore', 'threesome']
 from nltk.corpus import words %timeit list(filter(lambda x: x.startswith(wanted), words.words())) [out]: 64.8 ms ± 856 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) %timeit list(filter(lambda x: wanted in x, words.words())) [out]: 54.8 ms ± 528 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) %timeit [v for v in words.words() if v.startswith(wanted)] [out]: 57.5 ms ± 634 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) %timeit [v for v in words.words() if wanted in v] [out]: 50.2 ms ± 791 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
over 4 years ago · Hanz Gallego Denunciar

0

En lugar de devolver el resultado de la función any() , puede usar un bucle for para buscar la cadena:

 def find_match(string_list, wanted): for string in string_list: if string.startswith(wanted): return string return None >>> find_match(['ones', 'twos', 'threes'], "three") 'threes'
over 4 years ago · Hanz Gallego Denunciar

0

esto me parece simple, así que podría haberlo leído mal, pero podría ejecutarlo a través de un bucle foor con una declaración if;

 l = ['ones', 'twos', 'threes'] wanted = 'three' def run(): for s in l: if (s.startswith(wanted)): return s print(run())

salida: threes

over 4 years ago · Hanz Gallego Denunciar

0

Una respuesta simple y directa:

 test_list = ['one', 'two','threefour'] r = [s for s in test_list if s.startswith('three')] print(r[0] if r else 'nomatch')

Resultado:

 threefour

No estoy seguro de lo que quiere hacer en el caso de no coincidencia. r[0] es exactamente lo que solicitó si hay una coincidencia, pero no está definido si no hay una coincidencia. La print se ocupa de esto, pero es posible que desee hacerlo de manera diferente.

over 4 years ago · Hanz Gallego Denunciar

0

Diría que la solución más estrechamente relacionada sería usar next en lugar de any :

 >>> next((s for s in l if s.startswith(wanted)), 'mydefault') 'threes' >>> next((s for s in l if s.startswith('blarg')), 'mydefault') 'mydefault'

Al igual que any , detiene la búsqueda tan pronto como encuentra una coincidencia y solo ocupa el espacio O(1). A diferencia de las soluciones de comprensión de listas, que siempre procesan la lista completa y ocupan espacio O(n).

Ooh, alternativamente, simplemente use any tal como está, pero recuerde el último elemento marcado:

 >>> if any((match := s).startswith(wanted) for s in l): print(match) threes >>> if any((match := s).startswith('blarg') for s in l): print(match) >>>

Otra variación, solo asigne el elemento coincidente:

 >>> if any(s.startswith(wanted) and (match := s) for s in l): print(match) threes

(Es posible que desee incluir algo como or True si una s coincidente podría ser la cadena vacía).

over 4 years ago · Hanz Gallego Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda