2013-09-02 2 views
-1

Я пишу программу, которая берет буквы и индексы и выплевывает кроссворды (а не кроссвордер, но инструмент, помогающий в решении кроссвордов, если это имеет смысл).Crossword Solving Companion

Я написал две версии алгоритма, но ни один из них не работает правильно. Первый из них я попытался было это:

fin = open('words.txt') 

def answer_finder(): 
    global fin 
    possible_answers = [] 
    length = int(raw_input("How long is the word?")) 
    letter_1 = raw_input("What is the first letter that you know?").lower 
    letter_1_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    letter_2 = raw_input("What is the second letter that you know?").lower 
    letter_2_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    letter_3 = raw_input("What is the third letter that you know?").lower 
    letter_3_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    for i in fin: 
     if len(i) == length: 
      if i[letter_1_index] == letter_1 and i[letter_2_index] == letter_2 and i[letter_3_index] == letter_3: 
       possible_answers.append(i) 
    return possible_answers 

Я понимаю, что это своего рода некрасиво, но это было больше доказательство концепции алгоритма. Пользовательский ввод будет изменен позже. Во всяком случае, это, кажется, возвращает пустой список, независимо от того, что я пытаюсь.

Вторая версия была по существу такой же, но полагались на вложенной, если заявления вместо логических операторов:

def answer_finder(): 
    global fin 
    possible_answers = [] 
    length = int(raw_input("How long is the word?")) 
    letter_1 = raw_input("What is the first letter that you know?").lower 
    letter_1_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    letter_2 = raw_input("What is the second letter that you know?").lower 
    letter_2_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    letter_3 = raw_input("What is the third letter that you know?").lower 
    letter_3_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    for i in fin: 
     if len(i) == length: 
      if i[letter_1_index] == letter_1: 
       if i[letter_2_index] == letter_2: 
        if i[letter_3_index] == letter_3: 
         possible_answers.append(i) 
    return possible_answers 

Это тоже возвращает пустой список. Список слов, которые я использую, исходит от here. Я предполагаю, что мне не хватает чего-то очевидного, так как я новичок в работе с внешними файлами. Я хотел бы отметить, что эти функции являются прототипами первого, и оба работают нормально:

def greater_than_20(): 
    global fin 
    li = [] 
    for i in fin: 
     if len(i) > 20: 
      li.append(i) 
    return li 

def first_letter_length_finder(): 
    global fin 
    length = int(raw_input("How long is the word?")) 
    first_letter = raw_input("What is the first letter?") 
    li = [] 
    for i in fin: 
     if len(i) == length and i[0] == first_letter: 
      li.append(i) 
    print li 
    return li 

EDIT: (. В том числе закомментированных участков коды) Просто для справки, вот код в полном объеме

fin = open('words.txt') 
print fin 

def greater_than_20(): 
    global fin 
    li = [] 
    for i in fin: 
     if len(i) > 20: 
      li.append(i) 
    return li 

def first_letter_length_finder(): 
    global fin 
    length = int(raw_input("How long is the word?")) 
    first_letter = raw_input("What is the first letter?") 
    li = [] 
    for i in fin: 
     if len(i) == length and i[0] == first_letter: 
      li.append(i) 
    print li 
    return li 

def answer_finder(): 
    global fin 
    possible_answers = [] 
    length = int(raw_input("How long is the word?")) 
    letter_1 = raw_input("What is the first letter that you know?").lower 
    letter_1_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    letter_2 = raw_input("What is the second letter that you know?").lower 
    letter_2_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    letter_3 = raw_input("What is the third letter that you know?").lower 
    letter_3_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    for i in fin: 
     if len(i) == length: 
#   if i[letter_1_index] == letter_1 and i[letter_2_index] == letter_2 and i[letter_3_index] == letter_3: 
#    possible_answers.append(i) 
      if i[letter_1_index] == letter_1: 
       if i[letter_2_index] == letter_2: 
        if i[letter_3_index] == letter_3: 
         possible_answers.append(i) 
    return possible_answers 
+0

Вы, кажется, не разбиваете файл слова (или даже читаете его) ... это сделано в коде, который вы не опубликовали? –

+0

О, возможно. Все эти функции находятся в одном документе, и у меня вверху 'fin = open ('words.txt')'. Затем я вызываю «глобальный плавник» в каждую из функций. Я все еще супер новый с чтением файлов через Python, поэтому, если это не так, как это должно быть сделано, пожалуйста, дайте мне знать. Я добавил полный код программы для ссылки. – b4ux1t3

ответ

1

Вы используете метод string.lower, но вы пропустили ().

>>> letter_3 = raw_input("What is the third letter that you know?").lower 
What is the third letter that you know?a 
>>> letter_3 
<built-in method lower of str object at 0x104e514e0> 

>>> letter_3 = raw_input("What is the third letter that you know?").lower() 
What is the third letter that you know?a 
>>> letter_3 
'a' 

Без скобок, вы присваиваете значение не функции .lower, но и саму функцию.

EDIT: для записи (потому что я не могу оставлять комментарии), ваш метод использования for i in fin в порядке, так как файлы являются итерируемыми, разделенными \n.

+0

Ох. Мужчина. Хорошие глаза. Я, должно быть, прочитал это сто раз. Огромное спасибо. Теперь код работает отлично. Есть ли разница между двумя версиями алгоритма с точки зрения производительности? вложенные операторы ifs vs boolean? В основном любопытно, так как это не имеет большого значения в любом случае. – b4ux1t3

+1

В алгоритмической производительности нет большой разницы, потому что самый тяжелый материал на самом деле проходит через файл слов, который оба подхода выполняются хотя бы один раз. – glifchits

0

Прежде чем пытаться использовать данные, вам необходимо прочитать данные из файла.

fin = file('words.txt').readlines() 
+0

Это сделало код слишком медленным для загрузки, а 'answer_finder' по-прежнему возвращает пустой список. Есть ли метод, который я должен вызвать в функции для чтения строк? Если да, то почему 'first_letter_length_finder' (мне действительно нужно исправить это имя) работает, когда он делает практически то же самое с меньшим количеством входных данных? – b4ux1t3

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

  • Нет связанных вопросов^_^