我想生成单词和一个字母。但是所有生成的单词都必须包含该字母。我正在产生大量的单词。所以说:
是非常低效的node
或类似的东西。
(word for word in self.getWords(letters, 8) if letter in word)
代码:
getWords
我希望def getWords(self, iterable, maxDepth):
allWords = []
for depth in range(3, maxDepth + 1):
for word in itertools.permutations(iterable, depth):
allWords.append("".join(word))
只考虑其中包含getWords
的字词。有没有办法使用letter
来实现这个结果?
答案 0 :(得分:1)
首先,生成包含所需字母的单词子集:
def subset(char, words):
return set([word for word in words if char in word.lower()])
bsub = subset("b", words)
然后你可以随机抽取这些词:
# Take 100 random words which contain the letter b.
result = random.sample(bsub, 100)
或者,通过修改getWords,我们可以过滤掉不包含所需字母的单词:
def getWords(self, iterable, requiredLetter, maxDepth):
allWords = set()
for depth in range(3, maxDepth + 1):
for word in itertools.permutations(iterable, requiredLetter, depth):
if requiredLetter in word:
allWords.add(word) # or maybe word.lower() if it's case insensitive
还值得一提:如果allWords
中的每个字都是唯一的,将其转换为set()
会将会员资格测试从O(n)
减少到O(1)
。
集合更快,因为它不必遍历整个列表来测试成员资格。字符串是不可变的,因此它们被散列,这使得成员资格测试需要持续时间。
在你的情况下,你没有成为会员,所以转换到集合不会显着提高速度,但是选择一个子集会加快它的速度,因为每一代都不需要测试有效性。