Para obtener información sobre cómo recuperar coincidencias parciales en una lista numérica , vaya a:
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 ?
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?
startswith con y in , devuelve un valor booleano.in es una prueba de pertenencia.list-comprehension o un filter .list-comprehension , con in , es la implementación más rápida probada.l = list(map(str.lower, l)) .filter :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']words de nltk v3.6.5 , que tiene 236736 palabras'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)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'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
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.
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).