2013-12-03 3 views
1

Давайте предположим, что у меня есть отдельный текстовый файл, который содержит ряд цифр:Выбор случайного числа из списка, а затем его удаление?

1 
2 
3 

и так далее. Возможно ли, чтобы программа Python случайно выбрала одно из чисел в этом текстовом файле, а затем удалит это число из текстового файла? Я знаю, что можно сделать первое, но я борюсь со второй частью.

Если это помогает, список насчитывает около 180000 номеров. Я очень новичок в этом. Идея состоит в том, чтобы случайным образом назначить игроку номер, а затем удалить это число из списка, чтобы другой игрок не смог его получить.

+0

Можно * для любого языка программирования 1) прочитать файл в списке, 2) выполнить некоторое обновление (-ы) в списке, 3) записать обновленный список обратно в новую версию файла. – paulsm4

+1

Я думаю, что на ваш вопрос уже ответил, но ... вам действительно нужен текстовый файл? Если вам нужно многократно выполнять эту задачу с большими файлами, переписывание ваших txt-s будет очень медленным. Если вы не привязаны к txt-s, попробуйте что-то вроде двоичного (picky) формата pickle или numpy, в котором вы можете хранить свои данные гораздо больше пространства и времени. – leeladam

ответ

1

Предложение, которое я бы сказал, это то, что вы читаете весь текстовый файл, делаете любые изменения, которые хотите сделать с ним, а затем переписываете исходное содержимое файла, что является лучшим способом, насколько я знаю

1

Если файл маленький, прочитайте все это в списке, удалите значение из списка, а затем напишите новый список в файл temp. Наконец, переименуйте файл temp в исходное имя файла.

Если файл большой, прочитайте файл по одной строке за раз, введя значения (кроме одного) в файл temp. Затем переименуйте файл temp в исходное имя файла.

0

Как dstromberg said, если файл невелик, ознакомьтесь со стратегией documentation on file IO и this answer для написания списков в файл. Обратите внимание, что writelines() «не добавляет разделителей строк».

+0

[Ответ Аарона] (http://stackoverflow.com/a/20344316/1793234) замечательный. Вы все еще можете использовать информацию из приведенных выше ссылок для записи в текстовый файл, но я согласен с [leeladam] (http: // stackoverflow.com/questions/20343836/select-random-number-from-list-and-then-remove-it/20344006 # comment30366541_20343836), что ['pickle'] (http://docs.python.org/2/library/pickle .html) или [NumPy] (http://www.numpy.org), вероятно, будет лучше. – yurrriq

2

У вас есть 180 000 игроков? Если нет, то о решении проблемы наоборот:

  • Создайте файл со списком идентификаторов уже используемых
  • Для каждого нового пользователя:
    1. Создание достаточно большой случайный идентификатор (например, те, в ваш текущий файл)
    2. Запустите «используемые» идентификаторы в вашем файле и проверьте, что ваш новый идентификатор не сталкивается с существующим - если это так, создайте новые, пока не произойдет столкновение
    3. Добавить новый идентификатор к вашему файлу

Это будет намного быстрее, чем чтение, проверка и запись большого файла каждый раз. Если ваши идентификаторы большие, у вас не будет много коллизий.

Вы также можете оптимизировать процесс, например, используя идентификатор из двух частей, состоящий из сегодняшней даты и случайного числа. Затем вы сохраняете файл на каждый день, и вам нужно только проверить наличие коллизий с идентификаторами, выпущенными сегодня.

Смежные вопросы