我的目标是简单地制作一个刽子手游戏。但是,我有点过于雄心勃勃。我想让用户输入他们想要这个单词的时间。然后选择该长度的随机单词。索引该长度的整个字典在每次迭代时都会花费太长时间。所以。我有一个字典,格式如下:
zymosans
zymoscope
zymoses
...
我希望能够使用此程序自动为每个“单词长度”输出一个文件。像这样:
1letterwords.txt
2letterwords.txt
等等。
昨天我开始蟒蛇...我搜索了网站和这个网站,没有得到什么。 我想了解如何从这个特定的编程问题开始。 提前致谢! (为了澄清,刽子手游戏会在请求的wordlength文件中打开一个随机行,从而大大降低性能影响......)
答案 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'