2016-11-23 19 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)) 

私はそれらだけでletterとの言葉について考えgetWordsを持っていると思います。この結果を得るためにitertoolsを使用する方法はありますか?

+0

1つの方法は、生成された各単語に目的の文字を追加し、結果のシーケンスを置換することです。 – 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) 

次にあなたがそれらの単語のランダムなサンプルとることができます。私たちはできるgetWordsを変更することによって、また

# Take 100 random words which contain the letter b. 
result = random.sample(bsub, 100) 

を必要な文字が含まれていない単語を除外します。

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

関連する問題