2015-03-07 6 views
-2

Как бы кто-то взял случайное слово из списка многих? Words.txt - это текстовый файл с каждым словом в английском словаре, разделенный новой строкой.Выбор случайного слова из многих

+0

возможного дубликата [? Комплектование случайное слово В Python] (http://stackoverflow.com/questions/4394145/ pick-a-random-word-in-python) –

+0

Не уверен, что это подходящая цель для обмана - она ​​показывает, как использовать 'random.choice' для последовательности, а не для файла или итерации. –

+0

«Как бы кто-то взял случайное слово из списка многих», как и любой из них: D –

ответ

1

Вы можете эффективно взять случайную строку из файла, используя heapq, давая ему случайный ключ, например:

import random, heapq 

with open('Words.txt') as fin: 
    word, = heapq.nlargest(1, fin, key=lambda L: random.random()) 

Причина мы используем heapq.nlargest (мы могли бы использовать heapq.nsmallest - это довольно произвольно) здесь что он эффективнее с точки зрения памяти - нам остается только одна строка в памяти сразу. Он либо остается одной и той же линией, либо заменяется линией с более высоким случайным значением на каждой итерации входа. Это противоположность:

from random import choice 

with open('Words.txt') as fin: 
    words = list.readlines() 
word = choice(lines) 

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

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

Конечно, если вы знаете, что вам когда-нибудь понадобится 100 (выберите здесь) случайные слова, затем настройте параметры на heapq.nlargest и уничтожьте их из итерируемого, тогда, если вы закончите, решите, что делать дальше ,

import random, heapq 

with open('Words.txt') as fin: 
    words = heapq.nlargest(100, fin, key=lambda L: random.random()) 
    word_iter = iter(words) 

Затем, позже в сценарии, использовать что-то вроде:

try: 
    word = next(word_iter) 
except StopIteration: 
    # we've exhausted all our pre-loaded random words... 
    # either get more, fail, whatever... 
+0

Если бы нисходящий не возражал бы комментировать, как этот ответ может быть улучшен/если они найдут что-то не так с ним - это «Оцените. –

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