2012-04-10 3 views
3

В основном у меня есть скрипт на Python, который принимает несколько букв, получает каждую комбинацию из них, а затем проверяет, является ли это реальным словом (по-видимому, похоже, что-то похожее), но по какой-то причине оно возвращает одни и те же слова несколько раз, что я не хочу, чтобы это сделать, сценарий выглядит следующим образом:Сценарий возвращает одно и то же значение несколько раз

with open("dictionary.txt") as word_file: 
    english_words = set(word.strip().lower() for word in word_file) 

def is_english_word(word): 
    return word.lower() in english_words 

print is_english_word("ham") 
print is_english_word("zz") 

a = raw_input("Please enter first letter: ") 
b = raw_input("Please enter second letter: ") 
c = raw_input("Please enter third letter: ") 
d = raw_input("Please enter fourth letter: ") 
e = raw_input("Please enter fifth letter: ") 

check =[a,b,c,d,e] 

def get_combos(list): 
    import itertools 
    count = len(list) 
    got = [] 
    combos =[] 
    while count > 0: 
     for a in itertools.permutations(list,count): 
      if a in got: 
       got.append(a) 
      else: 
       got.append(a) 
       combos.append(a) 
     count = count - 1 
    for a in combos: 
     strip_combos(a) 

def strip_combos(list): 
    count = '' 
    words = [] 
    for entry in list: 
     count = count + entry 
     words.append(count) 
    check_combo(words) 

def check_combo(list): 
    words = [] 
    got = [] 
    for entry in list: 
     if is_english_word(entry): 
      if entry not in words: 
       print entry 
       words.append(entry) 

get_combos(check) 

Сейчас она работает, как я тоже имел в виду лишь печать слов, которые в словаре, но он будет печатать то же самое слово много раз, например, если имеются буквы:

a, c, e, s

Он будет возвращаться, как и во всех случаях, которые он показывает в списке, хотя, насколько я могу судить, я пропускаю один и тот же результат много раз в процедуре check_combo, имея полученный и список слов

У меня есть ощущение, что проблема может возникнуть из процедуры get_combos в цикле while, хотя я пробовал модифицировать почти все, но ничего не имею, поэтому я обращаюсь к тем, кто более осведомлен, чем я, за помощью.

+0

Некоторые строки документации/комментарии может помочь. Не совсем ясно, что, например, должно делать strip_combos. – weronika

+1

Строки уже итерабельны. Не нужно преобразовывать его в список. Вместо того, чтобы просить каждую букву отдельно, выполните: 'check = raw_input (« Пожалуйста, введите 5 буквенных слов: »)' –

ответ

2
 if a in got: 
      got.append(a) 
     else: 
      got.append(a) 
      combos.append(a) 

Это почти наверняка не то, что вы имели в виду :)

кажется, что вы хотите сделать, это получить уникальные результаты перестановок. Вы делаете это слишком сложным и медленным одновременно (потому что вы используете list в качестве структуры данных для поиска).

В частности, вы хотите получить набор результатов, как в математической концепции коллекции уникальных вещей. К счастью для вас, Python имеет этот встроенный модуль.

Действительно, вы делаете всю проблему слишком сложной, и ваш интерфейс неправильный; вы не должны быть print результатов на самом внутреннем уровне, но в самом внешнем (после return соответствующих данных). Хотя у вас есть больше уровней, чем вам нужно, потому что вы делаете слишком много работы для обработки списков данных вручную. Просто опишите нужные данные: пересечение набора слов, которые вы можете сделать из плиток, со словами, фактически содержащимися в словаре. Первый - это набор результатов объединения букв из буквенных комбинаций, которые вы получаете от нескольких итераторов itertools.permutations, которые вы можете связать вместе с itertools.chain.

def get_combos(letters): 
    return set(
     ''.join(x) 
     for x in itertools.chain(*(
      itertools.permutations(letters, count) 
      for count in range(len(letters)) 
     )) 
    ).intersection(english_words) 

Выполнено.

Или вы можете фильтровать набор, как вы идете:

def get_combos(letters): 
    return set(
     ''.join(x) 
     for x in itertools.chain(*(
      itertools.permutations(letters, count) 
      for count in range(len(letters)) 
     )) 
     if is_english_word(''.join(x)) 
    ) 
+0

Отлично, большое спасибо, это сделал трюк! Мне было интересно, есть ли способ добавить еще один элемент в список, который проверяет наличие анаграмм с дополнительной буквой, которая может быть любой буквой? Например, если у вас были три буквы, A, C и E, это показало бы, что с дополнительным письмом вы можете иметь ACED или ACES? – Coombes

+0

Если вы можете сделать слово с A, C, E и пробелом, то вы можете сделать (слово, которое удалено буквой) с A, C и E. Итак, сначала создайте набор английских слов с любой удаленной буквой , а затем проверить на это. –

0

Эта малая последовательность выглядит неправильно:

 if a in got: 
      got.append(a) 
     else: 
      got.append(a) 
      # .... 

Если вы действительно хотите добавить a к got независимо от того, какая ветвь выбрана, сделать это за пределами из if блока.

Смежные вопросы