2015-08-11 6 views
0

по какой-то причине я просто не могу перебирать словарь в Python. Я делал это раньше, но почему-то я не могу больше этого делать. Я чувствую, что мне не хватает чего-то очевидного, хотя я не знаю, что именно. В настоящее время я изучаю Python по адресу http://learnpythonthehardway.com/book Упражнение 48. Используя Nosetests и заданный тестовый код, я должен затем закодировать соответствующий код в реальном скрипте, чтобы сделать тестовую работу. Вот код в TestFile:Python итерации по словарю

from nose.tools import * 
from ex48 import lexicon 


def test_directions(): 
    assert_equal(lexicon.scan("north"), [('direction', 'north')]) 
    result = lexicon.scan("north south east") 
    assert_equal(result, [('direction', 'north'), 
          ('direction', 'south'), 
          ('direction', 'east')]) 

Так что теперь я писал этот код, чтобы сделать тестовую работу:

lex = { 'dir':'north', 'dir':'south', 'dir':'east', 'dir':'west', 
     'dir':'down', 'dir':'up', 'dir':'left', 'dir':'right', 
     'verb':'go', 'verb':'stop', 'verb':'kill', 'verb':'eat', 
     'stop':'the', 'stop':'in', 'stop':'of', 'stop':'from', 'stop':'at', 'stop':'it', 
     'noun':'door', 'noun':'bear', 'noun':'princess', 'noun':'cabinet'} 

def scan(word): 
    for k in lex: 
     if lex[k] == word: 
      return (k, word) 
    return None 

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

def scan(word): 
    for k, v in dict.iteritems(): 
    if v == word: 
     return (k, word) 
    return None 

Оба способа просто бросить None на меня, и я просто не могу понять, почему.

+0

Словари не работают так - вы можете только имеют одно значение, например ключ '' dir''. Кроме того, просмотрите отступы. – jonrsharpe

ответ

0

То, как вы строите словарь lex, неверно. Например, вы начинаете с хранения на север для ключевого каталога. Затем вы перезаписываете ключевой каталог с юга и т. Д. В конце только одно из этих значений сохраняется для каталога. Если вы хотите использовать несколько значений в одном ключе, объединить их в кортеже:

"dir" : ("north", "south", "east", "west")

вам нужно адаптировать свой другой код этого изменения тоже, то, хотя.

+0

Спасибо большое! Теперь, когда вы указываете это, я вижу, почему это не сработает. Думаю, это было просто очевидно. В любом случае, спасибо! – Sparkas

0

Что-то вроде следующего будет работать, список допустимых слов для каждого словаря ключ используется:

lex = { 'dir': ['north', 'south', 'east', 'west', 'down', 'up', 'left', 'right'], 
     'verb': ['go', 'stop', 'kill', 'eat'], 
     'stop': ['the', 'in', 'of', 'from', 'at', 'it'], 
     'noun': ['door', 'bear', 'princess', 'cabinet']} 

def scan(word): 
    for k, v in lex.items(): 
     if word.lower() in v: 
      return (k, word) 
    return None 

print scan('north') 

Что бы напечатать:

('dir', 'north') 
+0

Спасибо за предложение. Теперь он работает. Теперь я вижу, как мой оригинальный подход был полностью ошибочным. Еще раз спасибо! – Sparkas

+0

Добро пожаловать. –

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