Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

435
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda