如果键存在时键入字典返回false

时间:2015-05-13 13:19:30

标签: python if-statement semantics

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换行符

4 个答案:

答案 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.1input()不应该为您提供任何尾随回车/换行符。如果可以的话,我鼓励你升级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')

像这样你不需要串起任何额外的角色,你可以省去额外的编码。