在Python中对超大列表进行全排列

1 投票
1 回答
1300 浏览
提问于 2025-04-18 14:16

我写了一个程序,可以从一个文本文件中读取单词列表(每行一个单词),然后把这些单词组合成所有可能的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() 这个函数并不会直接生成一个列表,它使用的是一种叫做生成器的东西,只有在你需要下一个排列的时候,它才会生成。把这个调用放在列表推导式里,你实际上是在生成一个列表,这样就会把所有的排列一次性都放到内存里。这就违背了使用生成器的初衷。你应该把这一行改成:

撰写回答