按字长索引

时间:2011-06-29 23:03:27

标签: python dictionary indexing new-operator

我的目标是简单地制作一个刽子手游戏。但是,我有点过于雄心勃勃。我想让用户输入他们想要这个单词的时间。然后选择该长度的随机单词。索引该长度的整个字典在每次迭代时都会花费太长时间。所以。我有一个字典,格式如下:

zymosans

zymoscope

zymoses

...

我希望能够使用此程序自动为每个“单词长度”输出一个文件。像这样:

1letterwords.txt

2letterwords.txt

等等。

昨天我开始蟒蛇...我搜索了网站和这个网站,没有得到什么。 我想了解如何从这个特定的编程问题开始。 提前致谢! (为了澄清,刽子手游戏会在请求的wordlength文件中打开一个随机行,从而大大降低性能影响......)

4 个答案:

答案 0 :(得分:2)

将整个字典加载到内存中真的没什么大不了的。你可以尝试这样的事情:

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 :(得分:1)

获取文件的随机行可能不是你想做的...将它们保存在列表中和/或dict即使对于数百万个单词也应该没问题。

您可以通过迭代所有单词并将它们添加到列表种子defaultdict来按长度存储单词列表:

from collections import defaultdict
import random

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

然后,无论何时需要随机单词,您都可以:

randomLen = random.choice( wordsByLength.keys() )
randomWord = random.choice( wordsByLength[ randomLen ] )

或者你可以用你想要的指定长度替换randomLen。

答案 2 :(得分:0)

e.g。

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])

答案 3 :(得分:0)

当然,简单的方法效率不高,但真的太慢了吗?

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'

这台计算机上的单线版只需不到十分之一秒

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'