Python imprime una línea aleatoria desde el archivo sin repetir
python-3.x file (6)
El problema con su código es que si encuentra una línea que ya ha mostrado, simplemente regresa y no hace nada.
Lo que puede hacer con pequeños ajustes en su código es elegir una nueva línea aleatoria
hasta
que encuentre una que aún no haya elegido.
Esto se hace usando el bloque
while
:
# Variable for text file
text_database = ''./text_database.txt''
#List of already chosen lines
lines_list = []
# Elif instruction for random lines from file
elif command == ''/random'':
with open (text_database) as f:
lines = f.readlines()
random_tmp = random.choice(lines)
#while line has been chosen already, try to chose another one
while random_tmp in lines_list:
random_tmp = random.choice(lines)
lines_list.append(random_tmp)
print(random_tmp)
Tenga en cuenta que hay algunas limitaciones a este código:
- el bucle se ejecutará para siempre una vez que se hayan elegido todas las líneas
- recordar las líneas de texto que se han elegido puede consumir memoria; en cambio, puede recordar los índices de las líneas que ha elegido.
Tengo un pequeño programa que imprime líneas aleatorias de un archivo de texto. Quiero guardar las líneas ya elegidas en una lista u otra cosa, para que no se repita la próxima vez.
Ejemplo
text_database.txt
- Esta es una linea
- Esta es otra linea
- Esta es una línea de prueba
- Eso apesta
Este es un ejemplo para mostrar que la salida es aleatoria y el programa repite líneas; no es la salida directa en el terminal:
This is a line
That sucks
That sucks
That sucks
This is a line
Mi código:
# Variable for text file
text_database = ''./text_database.txt''
...
with open (text_database) as f:
lines = f.readlines()
print(random.choice(lines))
Lo que probé:
with open (text_database) as f:
lines_list = []
lines = f.readlines()
random_tmp = random.choice(lines)
if random_tmp not in lines_list:
lines_list.append(random_tmp)
print(random_tmp)
No funciona y necesito ayuda. Gracias chicos.
Esta es una solución REALMENTE desordenada, pero lo he probado de antemano
f = open(text_database, "r")
list = []
list_of_nums = []
for i in f:
list.append(i)
elif command == ''/random'':
randomNum = random.randint(0, len(list) - 1)
def reRun():
global randomNum
for i in list_of_nums:
if randomNum == i:
randomNum = random.randint(0, len(list) - 1)
reRun()
reRun()
list_of_nums.append(randomNum)
print(list[randomNum])
Lo que este código deos es ir a través de todas las líneas en f y ponerlas en una lista. entonces elige un número aleatorio entre 0 y la longitud de la lista e imprime una línea aleatoria correspondiente a ese número
¡Espero que esto ayude! Y bienvenido a apilar el desbordamiento
Hola, esto es un poco menos desordenado y tiene todas las características que solicitaste
f = open(text_database, "r")
list = []
for i in f:
list.append(i)
elif command == ''/random'':
random.shuffle(list)
for i in list:
print(i)
Esto obtiene todas las líneas en el archivo y las baraja usando pitones construidas al
random.shuffle
No hay posibilidad de que las líneas se repitan y es bastante eficiente.
pruebe esta solución, imprime solo una línea aleatoria cada vez
import random
text_database = ''./text_database.txt''
lines_list = []
with open (text_database) as f:
lines = f.readlines()
lines_list.append(lines)
for item in lines_list:
rand_item = item[random.randrange(len(item))]
print(rand_item)
elif command == ''/random'':
with open (text_database) as f:
lines = f.readlines()
while len(lines)>0:
max_int = len(lines)-1 #update the len each loop as we remove one each time
print(lines.pop(random.randint(0, max_int))) #pop a random value from the list
from random import sample
file_name = "text_database.txt"
lines = open(file_name, "r").read().splitlines()
for line in sample(lines, k=len(lines)):
print(line)
Uso
.read().splitlines()
lugar de
.readlines()
para purgar el espacio en blanco final (nuevas líneas) de cada línea.
También podría haber hecho:
lines = [line.rstrip("/n") for line in open(file_name, "r")]
Aquí hay una descripción de
random.sample
de la documentación:
Devuelve una lista de una longitud de elementos únicos elegidos de la secuencia de población. Utilizado para muestreo aleatorio sin reemplazo.
Alternativamente, podría haber barajado su lista de líneas y luego iterar sobre ellas.
EDITAR - Creo que lo entiendo ahora. ¿Cómo es esto?
def main():
from random import shuffle
file_name = "text_database.txt"
lines = open(file_name, "r").read().splitlines()
shuffle(lines)
sentinel = object()
def command_random():
try:
line = lines.pop()
except IndexError:
print("There are no more lines in the file!")
else:
print(line)
def command_quit():
nonlocal sentinel
sentinel = None
commands = {
"random": command_random,
"quit": command_quit
}
while sentinel is not None:
user_input = input("Please enter a command: ")
command = commands.get(user_input)
if command is None:
continue
command()
return 0
if __name__ == "__main__":
import sys
sys.exit(main())