Python 3.2
这可能真的很愚蠢,但是:
items = {'1': 'ACK', '2': 'RELQ', '3': 'COM'}
choice = input('Choose an option:\n1.ACK\n2.RELQ\n3.COM\n')
print(choice)
if choice in items:
print(choice)
option = items[choice]
else:
print('Input not recognized')
如果输入1,则会一直返回
1
Input not recognized
choice in items
返回false?
这应该很简单,但我不知道它是什么。
更新:
print(type(choice))` returns str
print(len(choice)) returns 2
print(repr(choice)) returns '1\r'
print(choice[0]) returns 1
输入正在接收带有input()
的\ r \ n换行符答案 0 :(得分:7)
可能它会抓取换行符,所以为了让你的代码工作,你应该修改选择变量。或者,如果你的dict键是int而不是字符串,你可以只执行转换操作。
编辑: 你的最后评论证明了我的观点,因为[49,13]数字 - 13是回车的ascii代码。
只需添加:
choice = choice.strip()
在if choice in items:
答案 1 :(得分:2)
您看到bug in Python 3.2.0, fixed in 3.2.1:input()
不应该为您提供任何尾随回车/换行符。如果可以的话,我鼓励你升级Python。
我坚持使用Python 3.2.0,你必须删除尾随的\r
字符:
import os
choice = input(…).rstrip(os.linesep) # Robust (no assumption)
或使用整数:
items = {1: …}
choice = int(input(…))
我会说,在你的情况下,这个第二个选择更自然,但是如果你还想添加字母作为选择,它就不起作用。
PS:ŁukaszR。的答案也很好:它给修剪空白(尾随空格......)提供了额外的好处。答案 2 :(得分:2)
您正在抓取额外的空格字符(\ n或\ r)。获得输入后,只需使用:
choice = choice.strip()
因此,您的字符串将从两侧修剪。如果开始使用空白字符,请使用:
choice = choice.rstrip()
答案 3 :(得分:1)
另一种解决方法是将输入返回值转换为字符串,因为items
字典中的键是字符串,如下所示:
items = {'1': 'ACK', '2': 'RELQ', '3': 'COM'}
choice = input('Choose an option:\n1.ACK\n2.RELQ\n3.COM\n')
choice = str(choice)
print(choice)
if choice in items:
print(choice)
option = items[choice]
else:
print('Input not recognized')
如果您不关心词典的类型,也可以让您的生活更轻松。键(无论是字符串,整数等),您可以简单地将它们定义为整数而不是字符串,如下所示:
items = {1: 'ACK', 2: 'RELQ', 3: 'COM'}
choice = input('Choose an option:\n1.ACK\n2.RELQ\n3.COM\n')
print(choice)
if choice in items:
print(choice)
option = items[choice]
else:
print('Input not recognized')
像这样你不需要串起任何额外的角色,你可以省去额外的编码。