Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

436
Views
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 answers
Answer question

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 Report

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 Report

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!