2015-02-05 2 views
-1

Я пытаюсь завершить Learn Python the Hard Way упражнение 48, и когда я тестирую носеты, к моему ужасу, я получаю KeyError на test_numbers() и test_errors(). Включенный в список вот мой код, который я использую (код в основном основаны от решения DairyLee в):Учиться Python Hard Way Ex 48

lexicon = {} 
for directions in ['north', 'south', 'east', 'west', 'down', 
        'up', 'left', 'right', 'back']: 
    lexicon.update({directions: 'direction'}) 
for verbs in ['go', 'stop', 'kill', 'eat']: 
    lexicon.update({verbs: 'verb'}) 
for stops in ['the', 'in', 'of', 'from', 'at', 'it']: 
    lexicon.update({stops: 'stop'}) 
for nouns in ['door', 'bear', 'princess', 'cabinet']: 
    lexicon.update({nouns: 'noun'}) 

stuff = raw_input('> ') 
words = stuff.lower().split() 

def scan(sentance): 
    words = sentance.lower().split() 
    pairs = [] 
    for word in words: 
     if lexicon[word] == 'direction': 
      pairs.append(('direction', word)) 
     elif lexicon[word] == 'verb': 
      pairs.append(('verb', word)) 
     elif lexicon[word] == 'noun': 
      pairs.append(('noun', word)) 
     elif lexicon[word] == 'stop': 
      pairs.append(('stop', word)) 
     elif lexicon[word] == 'noun': 
      pairs.append(('noun', word)) 
     elif convert_number(word) != None: 
      pairs.append(('number', convert_number(word))) 
     else: 
      pairs.append(('error', word)) 
    return pairs 

def convert_number(s): 
    try: 
     return int(s) 
    except ValueError: 
     return None 

А вот страница. http://learnpythonthehardway.org/book/ex48.html, который содержит соответствующую часть теста:

def test_numbers(): 
    assert_equal(lexicon.scan("1234"), [('number', 1234)]) 
    result = lexicon.scan("3 91234") 
    assert_equal(result, [('number', 3), 
          ('number', 91234)]) 


def test_errors(): 
    assert_equal(lexicon.scan("ASDFADFASDF"), [('error', 'ASDFADFASDF')]) 
    result = lexicon.scan("bear IAS princess") 
    assert_equal(result, [('noun', 'bear'), 
          ('error', 'IAS'), 
          ('noun', 'princess')]) 

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

+3

весь смысл делать учебник, чтобы попытаться понять этот тип материала для себя ... и я даже не уверен, что это вопрос – konkked

+0

я не вижу 'test_numbers() 'или' test_errors() 'в любом месте вашего кода. Однако я вижу 'try: введите код здесь'. –

+0

@konkked Я не понимаю, почему этот код не работает. Должен ли я публиковать мои результаты из powershell? – Reginsmal

ответ

1

Вот мой окончательный разработанный ответ. Спасибо Асаду за ярлык.

lexicon = {} 
for directions in ['north', 'south', 'east', 'west', 'down', 
        'up', 'left', 'right', 'back']: 
    lexicon.update({directions: 'direction'}) 
for verbs in ['go', 'stop', 'kill', 'eat']: 
    lexicon.update({verbs: 'verb'}) 
for stops in ['the', 'in', 'of', 'from', 'at', 'it']: 
    lexicon.update({stops: 'stop'}) 
for nouns in ['door', 'bear', 'princess', 'cabinet']: 
    lexicon.update({nouns: 'noun'}) 



stuff = raw_input('> ') 
words = stuff.lower().split() 

def scan(sentence): 
    words = sentence.split() 
    pairs = [] 
    for word in words: 
     try: 
      k = word.lower() 
      pairs.append((lexicon[k], word)) 
     except KeyError: 
      if convert_number(word) != None: 
       pairs.append(('number', int(word))) 
      else: 
       pairs.append(('error', word)) 
    return pairs 

def convert_number(s): 
    try: 
     return int(s) 
    except ValueError: 
     return None 
0
def scan(sentence): 
    words = sentence.split() 
    v = ["go","kill","eat","stop"] 
    dw ["north","south","east","west","down","up","left","right","back"] 
    sw = ["the","in","of","from","at","it"] 
    n = ["door","bear","princess","cabinet"] 
    sent = [] 
    for i in words: 
     if i in v: 
      result = ('verb', i) 
      sent.append(result) 
     elif i in dw: 
      result = ('direction', i) 
      sent.append(result) 
     elif i in sw: 
      result = ('stop', i) 
      sent.append(result) 
     elif i in n: 
      result = ('noun', i) 
      sent.append(result) 
     elif i.isdigit() and len(i)<=9: 
      result = ('number', int(i))`` 
      sent.append(result) 
     else: 
      result = ('error', i) 
      sent.append(result) 
    return sent 
+1

Привет. Добро пожаловать в SO. Отвечая на вопрос, предоставьте краткое объяснение проблемы и то, как ваш код разрешает ее, а не просто вставляет код. – Fejs

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