Индекс по длине слова - PullRequest
0 голосов
/ 30 июня 2011

Моей целью было просто сделать игру палача.Тем не менее, я был немного чрезмерно амбициозным.Я хочу попросить пользователя ввести, как долго они хотят слово.Затем выберите случайное слово этой длины.Индексирование всего словаря такой длины заняло бы слишком много времени на каждой итерации.Так.У меня есть словарь, отформатированный примерно так:

Зимозаны

Зимоскоп

Зимозы

...

Я хотел бы бытьвозможность автоматически выводить файл для каждой «длины слова» с помощью этой программы.Например:

1letterwords.txt

2letterwords.txt

и так далее.

Я запустил Python ... вчера.Я искал и в Интернете, и на этом сайте и ничего не нашел.Я хотел бы несколько советов о том, как начать с этой конкретной проблемы программирования.Заранее спасибо!(Для пояснения, игра в палач откроет случайную строку в запрошенном файле длины слова, уменьшая влияние на производительность ... довольно значительно.)

Ответы [ 4 ]

2 голосов
/ 30 июня 2011

Это действительно не так уж сложно загружать весь словарь в память.Вы можете попробовать что-то вроде этого:

import random
from collections import defaultdict

# load words
index = defaultdict(list)
with open('words.txt') as file:
    for line in file:
        word = line.strip().lower()
        index[len(word)].append(word)

# pick a random word
length = int(raw_input('Enter word length: '))
word = random.choice(index[length])

И если вы настаиваете на создании отдельных файлов по длине слова, запустите этот код после загрузки индекса, как показано выше:

for length in sorted(index):
    path = 'words%d.txt' % length
    with open(path, 'w') as file:
        for word in index[length]:
            file.write('%s\n' % word)
1 голос
/ 30 июня 2011

Получение случайных строк файлов, вероятно, не то, что вы хотите делать ... хранение их в списке и / или dict должно подойти даже для миллионов слов.

вы можете хранить список словпо длине, перебирая все свои слова и добавляя их в список семян. defaultdict:

from collections import defaultdict
import random

wordsByLength = defaultdict( list )
for word in allWords:
    wordsByLength[ len(word) ].append( word )

Тогда всякий раз, когда вам нужно случайное слово, вы можете сделать:замените randomLen на указанную длину, которую вы хотели.

0 голосов
/ 30 июня 2011

Конечно, простой способ не так эффективен, но разве действительно слишком медленный?

In [1]: import random

In [2]: timeit words = list(open("sowpods.txt"))
10 loops, best of 3: 48.4 ms per loop

In [3]: words = list(open("sowpods.txt"))

In [4]: len(words)
Out[4]: 267751

In [5]: timeit random.choice([w for w in words if len(w.strip())==6])
10 loops, best of 3: 62.5 ms per loop

In [6]: random.choice([w for w in words if len(w.strip())==6])
Out[6]: 'NAPKIN\r\n'

Версия с одним вкладышем на этом компьютере занимает менее 10-й секунды

In [7]: timeit random.choice([w for w in open("sowpods.txt") if len(w.strip())==6])
10 loops, best of 3: 91.2 ms per loop

In [8]: random.choice([w for w in open("sowpods.txt") if len(w.strip())==6])
Out[8]: 'REVEUR\r\n'

Вы можете добавить .strip() к этому, чтобы избавиться от '\r\n' на конце

0 голосов
/ 30 июня 2011

1001 *, например *

url = urllib.urlopen('http://download.oracle.com/javase/tutorial/collections/interfaces/examples/dictionary.txt')
random.choice([item for item in url if len(item) == 8])
...