在Python中对超大列表进行全排列
我写了一个程序,可以从一个文本文件中读取单词列表(每行一个单词),然后把这些单词组合成所有可能的3个单词的排列,最后把这些排列写入一个输出文件,每行一个排列。
import itertools
wordList = open("wordlist.txt", "r").readlines() # import words into list
wordListOut = open("output.txt", "w")
wordList = [item.rstrip() for item in wordList] # strip \n from list items
for item in [x for x in itertools.permutations(wordList, 3)]:
wordListOut.write("".join("%s %s %s\n" % item))
wordListOut.close()
这个程序看起来能正常工作,但我有点担心,因为所有的文本都存储在内存中,而且itertools.permutations()
会在内存中生成一个元组的列表。如果wordlist.txt
文件很大,程序很快就会耗尽内存。
如果每个排列可以直接写入输出文件,而不是先存到内存中,那样会更好。而且根据wordlist.txt
的大小,可能不需要把整个文件都加载到内存里。
另外,我该怎么避免在输出文件的最后一行加上\n
呢?
1 个回答
3
for item in [x for x in itertools.permutations(wordList, 3)]:
for item in itertools.permutations(wordList, 3):
这一行代码其实没有任何好处,反而会引发问题。permutations()
这个函数并不会直接生成一个列表,它使用的是一种叫做生成器的东西,只有在你需要下一个排列的时候,它才会生成。把这个调用放在列表推导式里,你实际上是在生成一个列表,这样就会把所有的排列一次性都放到内存里。这就违背了使用生成器的初衷。你应该把这一行改成: