生成始终包含特定字母python的字符串

时间:2016-11-23 20:12:28

标签: python itertools

我想生成单词和一个字母。但是所有生成的单词都必须包含该字母。我正在产生大量的单词。所以说:

是非常低效的
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来实现这个结果?

1 个答案:

答案 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)

集合更快,因为它不必遍历整个列表来测试成员资格。字符串是不可变的,因此它们被散列,这使得成员资格测试需要持续时间。

在你的情况下,你没有成为会员,所以转换到集合不会显着提高速度,但是选择一个子集会加快它的速度,因为每一代都不需要测试有效性。