如果字典中的键在键存在时返回 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.1:input()
不应该给您任何尾随回车 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')
像这样,您不需要串任何额外的字符,您可以节省额外的编码。
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.1:input()
不应该给您任何尾随回车 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')
像这样,您不需要串任何额外的字符,您可以节省额外的编码。