#python #python-3.x #python-requests
#python #python-3.x #python-запросы
Вопрос:
у меня в папке 3 файла. (pythonapp.py , numbers.txt , usednumbers.txt ). Итак, в основном мое приложение извлекает случайную строку из (numbers.txt ) и сохраняет ее в переменной. Затем он записывает переменную в (usednumbers.txt ). Но проблема в том, что я не хочу записывать повторяющиеся строки в (usednumbers.txt ). Поэтому я бы хотел, чтобы мое приложение проверяло всякий раз, когда оно получает новую случайную строку из (numbers.txt ), что, если она уже использовалась в прошлом (так что, если она существует в usednumbers.txt )
#imports-------------------------------
import random
#variables-----------------------------
line = random.choice(open('numbers.txt').readlines()) #get a random string
textfile = open("usednumbers.txt", "a") #open usednumbers txt file
#main----------------------------------
#here: need to check if our selected random variable "line"
#is in txt file "usednumbers.txt", if it exists there, we get a new random number
#if it doesn't exist there, we continue and write the variable there (below)
textfile.write(line) #store the number we are going to use
textfile.close() #so in future we avoid using this number again
Ответ №1:
Вы можете немного изменить свой код, снова и снова проверяя файл, это будет излишним, а чтение занимает много времени.
Таким образом, вы можете прочитать файл number и отфильтровать число, которого нет в usednumber, и выбрать из него случайное число.
#imports-------------------------------
import random
#variables-----------------------------
numbers = open('numbers.txt').read().splitlines() #get a random string
# alreday in usednumbes
already_in_file = set([x for x in open("usednumbers.txt", "r").read().splitlines()])
# filtering only those number swhich are not in number.txt
numbers = [x for x in numbers if x not in already_in_file]
#choose random number
if len(numbers) >0 :
line = random.choice(numbers)
#main----------------------------------
textfile = open("usednumbers.txt", "a") #open usednumbers txt file
textfile.writelines(str(line) "n") #store the number we are going to use
textfile.close() #so in future we avoid using this number again
Ответ №2:
Вы можете проверить, находится ли выбранная строка в строках текстового файла.
#imports-------------------------------
import random
#variables-----------------------------
line = random.choice(open('numbers.txt').readlines()) #get a random string
textfile = open("usednumbers.txt", "a") #open usednumbers txt file
#main----------------------------------
#here: need to check if our selected random variable "line"
#is in txt file "usednumbers.txt", if it exists there, we get a new random number
#if it doesn't exist there, we continue and write the variable there (below)
while(line in open('usednumbers.txt').readlines()):
line = random.choice(open('numbers.txt').readlines()) #get a random string
textfile.write(line) #store the number we are going to use
textfile.close() #so in future we avoid using this number again
Обновить:
Не самое эффективное по времени решение.
Смотрите решение, предоставленное @Suryaveer Singh для более оптимизированного решения.
Комментарии:
1. Решение работает, но предположим, что у нас есть число в несколько тысяч
number.txt
, тогда цикл while будет выполняться вечно, поскольку операция чтения-записи является дорогостоящей. Сложность решения превышает O (n ^ 2), поэтому, если у вас в файле 1 миллион чисел, на проверку уйдут годы.2. @SuryaveerSingh Кроме того, не только операции чтения-записи являются дорогостоящими, но и решение основано на чистой случайности. Итак, если оба файла содержат миллион записей, а в numbers.txt ошибка в usednumbers.txt может потребоваться буквально вечность, чтобы одна из этих записей была выбрана случайным образом среди миллионов других.
3. точно, я пытался передать только это. Спасибо за понимание 🙂 Я опубликовал свой ответ, вы можете проверить это
4. @SuryaveerSingh Я сделал, я поддержал это. Спасибо, что указали на это. 🙂