2014-10-22 5 views
0

Прежде всего, это домашнее задание (из-за завтра, забавный факт). Цель этого задания - взять строку, которую вводит пользователь, а затем выполнить поиск через предоставленный нам файл словаря и распечатать любое слово, содержащее только одну из этих букв.
Код, который я до сих пор ниже. Я попытался использовать регулярные выражения, но похоже, что это работает только для шаблонов, и я не хочу, чтобы он находил только совпадающие шаблоны, буквы могут быть в любом месте слова.
Другое важное примечание. Мне не разрешено использовать списки в этом задании, и я думаю, что я столкнулся с большинством проблем. Наряду с этим длина строки будет меняться каждый раз.Поиск слов, содержащих только одну букву в строке

import re 
dictionary = open('dictionary.txt','r') 

def all_but_one_letter(): 
    user_string = input("Please enter a string of characters: ") 
    print(user_string) 
    line = 'begin' 
    while line != "": 
     line = dictionary.readline() 
     line = line.rstrip() 
     if re.findall(user_string, line) == 1: 
      print(line) 

all_but_one_letter()    

dictionary.close() 

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

+0

Я не уверен, что вы подразумеваете под «, который имеет только одну из этих букв». Любые примеры ввода, dict и что должно произойти с этим вводом? – Jerry

ответ

3

Использование sets:

s1 = "foobar" 
s2 = "fooba" 
st1 = set(s1) 


print(len(st1.intersection(s2)) == len(st1) - 1) 
True 

Вы должны использовать с, чтобы открыть файлы, и вы можете просто перебирать файл объекта:

def all_but_one_letter(): 
    with open('dictionary.txt','r') as dictionary: 
     user_string = input("Please enter a string of characters: ") 
     for line in dictionary: 
      words = line.rstrip().split() # split into individual words 
      for word in words: 
       st1 = set(user_string) 
       if len(st1.intersection(word)) == len(st1) - 1: 
        print(word) 

пересечение будет найти общие буквы, если пересечение равно к длине набора s1, то все, кроме одной буквы, равны

In [1]: s1 = "foobar" 
In [2]: s2 = "fooba" 
In [3]: st1 = set(s1)  
In [4]: len(st1.intersection(s2)) == len(st1) - 1 
Out[4]: True  
In [5]: s1 = "fooba"  
In [6]: s2 = "fooba"  
In [7]: st1 = set(s1)  
In [8]: len(st1.intersection(s2)) == len(st1) - 1 
Out[8]: False 
+0

[Я немного изменил ваш ответ, чтобы исправить не связанные с основными вопросами вопросы] (http://stackoverflow.com/a/26514831/4279). – jfs

0

Если вы не можете использовать список, вы можете проверять каждое слово в файле словаря по одному за раз. Итак, давайте напишем функцию, чтобы сделать это:

def checkWord(word, letters): 
    answer = 0 
    for letter in letters: 
     if letter in word: 
      answer += 1 
    if answer == len(letters)-1: # `word` contains all but one letter 
     return True 
    else: 
     return False 

Теперь у нас есть этот компонент, давайте напишем функцию, чтобы принимать входные данные от пользователя и от этого файла словаря:

def main(infilepath): 
    letters = input("Enter a string of letters: ") 
    with open(infilepath) as infile: 
     for line in infile: 
      word = line.strip() 
      if checkWord(word, letters): 
       print(word, "has all but one letter in", letters) 
0

Это предполагает, есть нет повторяющихся букв, т. е. одна или другая строка содержит два «а», например. Если есть буквы, которые встречаются более одного раза, вам нужно будет найти способ удалить каждую букву, как она найдена (поскольку вы не можете использовать списки, скопируйте буквы, не найденные в новую строку). Кроме того, dictionary.readline() будет проходить через файл один раз и поместить указатель в конец файла, поэтому последующий readline при следующем прохождении программы через цикл while ничего не даст, поскольку читать с конца файла нечего. Вы должны использовать readlines() или некоторые другие средства для получения данных в список, чтобы вы могли многократно перебирать его. Этот код не был протестирован, поэтому опечатки и т. Д. До вас исправляются.

def all_but_one_letter(dictionary): 
    user_string = input("Please enter a string of characters: ") 
    user_string=user_string.lower() 
    print(user_string) 
    found=0 
    for line in dictionary: 
     line = line.rstrip().lower() 
     print(line) 
     if line in user_string: 
      found += 1 
     else: 
      print("Not Found") 

    if found == len(user_string)-1 
     print("Success") 
    else: 
     print("Failure") 

dictionary = open('dictionary.txt','r').readlines() 
all_but_one_letter(dictionary)    
0

Для печати слов из dictionary.txt, которые имеют все, кроме одного письма от заданной строки пользователя:

#!/usr/bin/env python3 
def all_but_one_letter(word, letters): 
    """Whether *word* contains all but one letter from *letters*.""" 
    return len(letters.intersection(word)) == (len(letters) - 1) 

letters = frozenset(input("Please enter a string of characters: ")) 
with open('dictionary.txt') as file: 
    for line in file: 
     for word in line.split(): 
      if all_but_one_letter(word, letters): 
       print(word) 

Реализация all_but_one_letter(word, letters) является suggested by @Padraic Cunningham. Я изменил его ответ, чтобы исправить не связанные с основным вопросом небольшие проблемы в коде.

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