如果字典中的键在键存在时返回 false

If key in dictionary returning false when key exists

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 返回错误?

这应该很简单,但我就是看不出它是什么。

更新:

print(type(choice))` returns str

print(len(choice)) returns 2

print(repr(choice)) returns '1\r'
print(choice[0]) returns 1

输入正在接收一个 \r 换行符与 input()

可能它获取了换行符,所以为了让您的代码正常工作,您应该 trim 选择变量。或者,如果您的字典键是整数而不是字符串,您可以只执行强制转换操作。

编辑: 你最后的评论证明了我的观点,因为 [49, 13] 数字 - 13 是运输 return.

的 ascii 代码

只需添加:

choice = choice.strip()

if choice in items:

之前

您看到的是 bug in Python 3.2.0, fixed in 3.2.1input() 不应该给您任何尾随回车 return/newline 字符。如果可以的话,我鼓励你升级 Python。

如果您遇到 Python 3.2.0,您必须删除尾随的 \r 字符:

import os
choice = input(…).rstrip(os.linesep)  # Robust (no assumption)

或始终使用整数:

items = {1: …}
choice = int(input(…))

第二个选择更自然,我想说,在你的情况下,但如果你还想添加字母作为选择,它就不起作用了。

PS:Łukasz R. 的回答也很好:它提供了修剪空格(尾随空格,...)的额外好处。

您正在抓取额外的白色-space 字符(\n 或\r)。获得输入后只需使用:

choice = choice.strip()

因此,您的字符串会从两侧被修剪。如果开始白色 space 个字符很重要,请使用:

choice = choice.rstrip()

解决此问题的另一种方法是将输入的 return 值转换为字符串,因为 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')

像这样,您不需要串任何额外的字符,您可以节省额外的编码。