phone_book = {
'qazi': ['123-456-7890', 'qazi@qazi.com'],
'bob': ['345-654-4321', 'bob@bob.com'],
'cat': ['654-543-2345', 'cat@cat.com']
}
name = raw_input('enter name: ')
action = raw_input('enter 0 for ph# or 1 for email: ')
print(phone_book['%s']['%d']) % (name, action)
上面的代码是我需要帮助的。
我的目标是能够输入一个人的姓名以及他们是否愿意使用将由用户输入的raw_input来呼叫该人的电话号码,电子邮件地址或两者。不幸的是,每次运行代码时,都会出现以下错误:
enter name: bob
enter 0 for ph# or 1 for email: 1
Traceback (most recent call last):
File "main.py", line 10, in <module>
print(phone_book['%s']['%d']) % (name, action)
KeyError: '%s'
exited with non-zero status
答案 0 :(得分:3)
您正在将%
运算符应用于错误的操作,并且它不会真正实现您想要实现的目标。
您要求Python执行此操作:
(*some expression*) % (name, action)
其中某个表达式是phone_book['%s']['%d']
,因此Python首先执行该部分。因此Python进一步打破了这一点,首先执行phone_book['%s']
并将['%d']
应用于结果。并且执行phone_book['%s']
首先意味着将字符串'%s'
传递给phone_book
字典。当然没有这样的钥匙。 Python当然不会将%
运算符应用于结果,在它到达之前已经引发了异常。
所有这些意味着您无法将%
printf样式格式应用于非单个字符串的内容。您有多个字符串,因此您需要将格式分别应用于每个字符串:
print phone_book['%s' % name]['%d' % action]
但name
已一个字符串,因此使用'%s'
将其转换为字符串是多余的。直接传递它:
print phone_book[name]['%d' % action]
使用'%d' % action
也是错误的做法。字符串格式仍会生成字符串,所有%d
都可以帮助您很好地格式化数字输入,因此它允许您将整数转换为字符串。你想要不同的东西,你想把字符串action
变成一个整数,所以反过来。您可以使用int()
函数执行此操作:
print phone_book[name][int(action)]
然后,做你原本想要的。请注意,%
运算符无处可见!仅使用该运算符格式化字符串输出,而不是处理输入。
答案 1 :(得分:1)
就这样:
print(phone_book[name][int(action)])
索引必须是整数,并且调用dict键可以直接执行变量,因为它将读取其内容。