2016-11-23 43 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

相關問題