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