Encontrar en un archivo de texto la primera palabra que empiece por ...
ResueltoHola,
¿Cómo encontrar, en un archivo de texto grande (aproximadamente 3000 palabras, una palabra por línea, en orden alfabético), la primera palabra que empiece por una cadena dada? Lo hago con un bucle FOR, pero ¿es posible ir más rápido, con una instrucción de búsqueda directa, un poco como seek()?
4 respuestas
-
seek() se utiliza para posicionarse en un archivo. ¿Dónde te vas a volver a posicionar?
¿Cómo lo haces ahora?
Dices "empezando" por una cadena. ¿Conoces el slicing? (si conoces la longitud de la cadena?)
Comienza por esto antes de pensar en métodos más sofisticados.
Lo hago fácilmente con archivos de más de 300 000 palabras.
No debe ser tan largo con unas 3000 palabras. -
¿reposicionar?
¿No hay forma de eliminar? -
Moderador
Hola,
Un archivo de 3000 palabras es pequeño y, por lo tanto, tu función no requiere optimización especial.
Además, no hay realmente una forma de acelerar el código (lo que será "lento" es leer el archivo y cargar las 3000 palabras en memoria). Así que, por mi parte, escribiría esto.
toto.py
#!/usr/bin/env python3 from pathlib import Path filename = Path("data.txt") assert filename.exists() with open(filename) as f: lines = [ line.strip() for line in f.readlines() if line.startswith("str") ] print(lines)data.txt
aaa bbb str1 ssstr2 str2aa str3 xxstr
Ejecución :
['str1', 'str2aa', 'str3']Si buscas diccionarios (realmente muchos) más grandes, podrías contemplar serializarlos (ver por ejemplo los módulos pickle o dill).
Luego, si la pregunta es cómo buscar de manera eficiente el índice de un elemento en una lista ordenada (y en memoria), entonces podrías plantearte una búsqueda binaria. Ver aquí para más detalles.
Buena suerte
-
< p>Muchas gracias a ustedes dos.
Aquí está lo que había hecho:
# Encontrar todos los palabras en Dico.txt, # comenzando por deb, variable definida previamente. with open(r"Dico.txt", "r") as f: for mot in f: if mot[0:len(deb)] == deb: # tratamiento_mot --> llamada a la función # tratando cada palabra correspondiente
Veo que ambos piensan que no hace falta optimización.
Y el método con "startswith" propuesto por mamiemando es bastante compacto y elegante. Voy a hacer eso.
En realidad, lo que tenía en mente es algo como la instrucción FIND, seguida de una cadena, que daba, antiguamente, en dBase IV, directamente el índice de la primera palabra que empieza por esa cadena en el archivo. Sin bucle. Pero bueno, me ciño a "startswith". Problema resuelto.
Un GRAN MERCI a ustedes dos.
-
Moderador
De hecho, es sobre todo que no puedes hacer mucho mejor sin pasar por una estructura intermedia como un Trie. Generar una estructura así solo resulta rentable si el corpus es muy grande (lo cual no es tu caso) y/o si se hace un gran número de búsquedas.
-