2016-11-23 44 views
2

我想生成单词加一个字母。但是所有生成的单词都必须包含该字母。我产生了大量的文字。所以说这是非常低效的:生成总是包含某个字母的字符串python

(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话。有没有办法使用itertools来实现这个结果?

+0

一种方法是将所需的字符追加到每个生成的单词,然后对生成的序列进行排列 – martianwars

+0

@KalpeshKrishna谢谢! – rassar

回答

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)

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

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

+0

谢谢!你能解释一下为什么它更有效吗? – rassar

+0

@rassar我已经更新了我的答案......为了您的目的,套件不是真正的加速。 – TemporalWolf

+0

这是有道理的。非常感谢。 – rassar

相关问题