2015-11-08 2 views
0

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

def main(): 
    print("This program tells you about the animal of your choice") 
    animal=input("What animal would you like to look up: ") 
    animal=animal.lower() 

    d2={ 
     "lion":{"name":"Lion","species":"Panthera leo", 
     "image":"http://en.wikipedia.org/wiki/File:Lion_waiting_in_Namibia.jpg", 
     "fact":"Vulnerable species"}, 
    "dog":{"name:":"Dog","species":"Canis lupus familiaris", 
     "image":"http://en.wikipedia.org/wiki/File:YellowLabradorLooking_new.jpg", 
     "fact":"Common house pet"}, 
     "hippo":{"name":"Hippo","species":"Hippopotamus amphibius", 
        "image":"https://en.wikipedia.org/wiki/Hippopotamus#/media/File:Hippopotamus_-_04.jpg", 
        "fact":"Erbivorous mammal"}, 
     "cat":{"name":"Cat","species":"Felis catus", 
       "image":"https://en.wikipedia.org/wiki/Cat#/media/File:Cat_poster_1.jpg", 
       "fact":"Purring hunters"} 
     } 
    if animal in d2: 
     print(d2(animal["name"]), "is the common name") 
     print(d2(animal["species"]), "is its latin name") 
     print(d2(animal["image"]), "is a picture of", animal) 
     print(d2(animal["fact"]),) 
    else: 
     print("Not in dicionary, try lion, dog, hippo, or cat") 
main() 
+0

Некоторые отступы исчезли, когда я вставил код, так что почему текст выглядит так смешано в d2 – Magnus

+1

Элементы 'dict' имеют доступ к' [] ', а не'() '. – sobolevn

+0

Вы заметили, что используете скобки вместо скобок для доступа к словарю? – TigerhawkT3

ответ

3

Когда вы делаете:

print(d2(animal["name"]), "is the common name") 

Указывает вы лечите d2 как функция. Вместо этого попробуйте

animal_dict = d2.get(animal, {}) 
animal_name = animal_dict.get("name") 
print("%s is the common name" % animal_name) 

и так далее ..

+0

Вы не нуждаетесь в '.keys()' в Python 3. – TigerhawkT3

+0

не соглашайтесь на свой первый stmt ... если животное в d2 такое же, как если бы животное в d2.keys() и животное в d2 является предпочтительным и кратким .... – labheshr

+0

Согласен! То же самое и с Python2. Я имел в виду, что лучше быть явным :) – karthikr

1

Это довольно просто, учил. Смотрите ...

print(d2(animal["name"]), "is the common name") 

Это означает, что «печать возвращаемого значения вызова d2 (с единственным аргументом, как объект с индексом "name" в animal) и строкой "is the common name"».

Это не имеет никакого смысла, нет? Вы не можете использовать круглые скобки (оператор вызова, ()), чтобы «вызвать» словари. Это имеет смысл для вас? IHMO, это не имеет смысла.

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

d2[animal["name"]] 

Это означает: «объект с индексом (объект с индексом "name" в animal) в d2». Опять же, это не имеет смысла. Правильный путь ...

d2[animal]["name"] 

Это означает, что «объект с индексом "name" в объекте с индексом animal в d2». Теперь это имеет смысл! Вы должны применить один и тот же шаблон изменения ко всем своим операторам печати.

Почему это происходит? d2 - словарь словарей. Таким образом, ...

x = d2[animal] 

средства "магазин объект по индексу animal в d2 в x". Тогда ...

x["name"] 

средства "объект по индексу "name" в x". Теперь это имеет смысл для вас? ;).

Редактировать: Для тех, кто вводят в заблуждение по историческим причинам, (почти) никогда использование input() в Python 2.x, если вы не знаете, что вы делаете! Вместо этого используйте raw_input() (тот же интерфейс).

Я надеюсь, что это привело к вам некоторый свет!

+0

Да, спасибо. Тем не менее, используя ваш метод, я получаю KeyError по имени ... Вы уверены, что я могу написать print (d2 [animal] ["name"]) – Magnus

+0

@ Mgnus: Если вы на Python2, используйте 'raw_input() 'и ** never ** использовать' input() '(если вы не на Python3). – 3442

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