无法将 "for key in dict" 转换为 == 以进行精确匹配
Trouble converting "for key in dict" to == for exact matching
早上好,
我无法从我的字典中提取正确的值,因为有相似的键。我相信我需要使用 == 而不是 in 但是当我尝试将 if key in c_item_number_one:
更改为 if key == c_item_number_one:
时只是 returns 我的 if not_found: print("Specify Size One")
但是我知道字典里有 12"。
c_item_number_one = ('12", Pipe,, SA-106 GR. B,, SCH 40, WALL smls'.upper())
print(c_item_number_one)
My formula is as follows:
def item_one_size_one():
not_found = True
for key in size_one_dict:
if key in c_item_number_one:
item_number_one_size = size_one_dict[key]
print(item_number_one_size)
not_found = False
break
if not_found:
print("Specify Size One")
item_one_size_one()
当前结果为:
12", PIPE,, SA-106 GR. B,, SCH 40, WALL SMLS
Specify Size One
in
一词在这里有两种用法 - 第一种是在 for
循环的上下文中,第二种完全不同的用法是在比较的上下文中。
在 for 循环的构造中,in
关键字将用于保存从循环中提取的值的变量连接到包含要循环的值的对象。
例如
for x in list:
同时,in
关键字的完全不同用法可用于告诉 python 执行集合测试,其中测试左侧项目以查看它是否存在于rhs-对象的集合。
例如
if key in c_item_number_one:
因此 in
关键字的含义有点上下文关系。
如果您的代码给出了意想不到的结果,那么您应该能够替换 if 语句以使用 ==
测试,同时保持其他一切不变。
例如
if key == c_item_number_one:
但是,由于 c_item_number_one
的内容是一个元组,您可能只想测试该元组中第一项的相等性 - 例如数字 12。您应该通过索引要进行比较的元组中的元素来执行此操作:
if key == c_item_number_one[0]:
此处 [0]
告诉 python 仅从元组中提取第一个元素以执行 ==
测试。
[edit] 抱歉,您的 c_item_number_one 不是元组,而是一个长字符串。您需要的是一种明确标识要查找的每个项目的方法,使用用户可以输入的唯一代码或值来唯一标识每件事情。像这样进行字符串匹配总是会引发问题。
然后可能会增加一些细微差别,您的示例元组中的第一个键是 '12'
的字符串。如果 ==
测试中的键是数值 12(即整数),那么测试 12 == '12'
将 return false 并且您不会提取您想要的值。您现有的 in
测试目前成功表明这不是问题,但稍后可能需要注意。
要将用户输入拆分为字段,请使用 re.split
>>> userin
'12", PIPE,, SA-106 GR. B,, SCH 40, WALL SMLS'
>>> import re
>>> fields = re.split('[ ,]*',userin)
>>> fields
['12"', 'PIPE', 'SA-106', 'GR.', 'B', 'SCH', '40', 'WALL', 'SMLS']
然后将键与第一个字段或所有字段进行比较:
if key == fields[0]:
早上好,
我无法从我的字典中提取正确的值,因为有相似的键。我相信我需要使用 == 而不是 in 但是当我尝试将 if key in c_item_number_one:
更改为 if key == c_item_number_one:
时只是 returns 我的 if not_found: print("Specify Size One")
但是我知道字典里有 12"。
c_item_number_one = ('12", Pipe,, SA-106 GR. B,, SCH 40, WALL smls'.upper())
print(c_item_number_one)
My formula is as follows:
def item_one_size_one():
not_found = True
for key in size_one_dict:
if key in c_item_number_one:
item_number_one_size = size_one_dict[key]
print(item_number_one_size)
not_found = False
break
if not_found:
print("Specify Size One")
item_one_size_one()
当前结果为:
12", PIPE,, SA-106 GR. B,, SCH 40, WALL SMLS
Specify Size One
in
一词在这里有两种用法 - 第一种是在 for
循环的上下文中,第二种完全不同的用法是在比较的上下文中。
在 for 循环的构造中,in
关键字将用于保存从循环中提取的值的变量连接到包含要循环的值的对象。
例如
for x in list:
同时,in
关键字的完全不同用法可用于告诉 python 执行集合测试,其中测试左侧项目以查看它是否存在于rhs-对象的集合。
例如
if key in c_item_number_one:
因此 in
关键字的含义有点上下文关系。
如果您的代码给出了意想不到的结果,那么您应该能够替换 if 语句以使用 ==
测试,同时保持其他一切不变。
例如
if key == c_item_number_one:
但是,由于 c_item_number_one
的内容是一个元组,您可能只想测试该元组中第一项的相等性 - 例如数字 12。您应该通过索引要进行比较的元组中的元素来执行此操作:
if key == c_item_number_one[0]:
此处 [0]
告诉 python 仅从元组中提取第一个元素以执行 ==
测试。
[edit] 抱歉,您的 c_item_number_one 不是元组,而是一个长字符串。您需要的是一种明确标识要查找的每个项目的方法,使用用户可以输入的唯一代码或值来唯一标识每件事情。像这样进行字符串匹配总是会引发问题。
然后可能会增加一些细微差别,您的示例元组中的第一个键是 '12'
的字符串。如果 ==
测试中的键是数值 12(即整数),那么测试 12 == '12'
将 return false 并且您不会提取您想要的值。您现有的 in
测试目前成功表明这不是问题,但稍后可能需要注意。
要将用户输入拆分为字段,请使用 re.split
>>> userin
'12", PIPE,, SA-106 GR. B,, SCH 40, WALL SMLS'
>>> import re
>>> fields = re.split('[ ,]*',userin)
>>> fields
['12"', 'PIPE', 'SA-106', 'GR.', 'B', 'SCH', '40', 'WALL', 'SMLS']
然后将键与第一个字段或所有字段进行比较:
if key == fields[0]: