Python 字典代码只是一次又一次地循环
我有一个文本文件,我正在为一个名为“Bodn's Superstore”的模拟商店设计。Python 字典代码只是一次又一次地循环,python,loops,dictionary,Python,Loops,Dictionary,我有一个文本文件,我正在为一个名为“Bodn's Superstore”的模拟商店设计。 我设计了一个.txt数据库 iPhone 28273139 5.50 书 81413852 1.50 充电器 62863152 3 塞子 25537398 4.50 您可以看到它遵循以下格式 名称 代码 价格 我编写的代码旨在将数据库转换为字典,客户可以选择购买的产品数量。然后,他们将8位数的代码输入计算机,空闲的计算机就会计算出产品的名称 代码显示在下面。它首先验证代码以确保其长度为8个字符。(Pyt
我设计了一个.txt数据库
iPhone
28273139
5.50
书
81413852
1.50
充电器
62863152
3
塞子
25537398
4.50
您可以看到它遵循以下格式
名称
代码
价格
我编写的代码旨在将数据库转换为字典,客户可以选择购买的产品数量。然后,他们将8位数的代码输入计算机,空闲的计算机就会计算出产品的名称
代码显示在下面。它首先验证代码以确保其长度为8个字符。(Python 3.4.2)
现在,代码的验证工作开始了。
比如说,我想买一部iPhone。
这是主窗口中显示的内容
说明所需数量。>>1.
你想要什么产品?输入产品代码>>2827313
代码长度必须为8个字符。
你想要什么产品?输入产品代码>>28273139
你想要什么产品?输入产品代码>>28273139
你想要什么产品?输入产品代码>>
等等等等。
这段代码根本无法反向查找字典的键并将其打印出来,即“iPhone”。
在我陈述了我的数量和产品代码之后,我希望收到名称“iPhone”,但我的Python文件无法通过字典找到与我提供的产品代码(值)对应的密钥。我不明白为什么需要搜索文件中的
行
;似乎是抄袭错误
无论如何,userCode
永远不等于value
,因为value
是一个元组;但是,它可以等于保存代码的值[0]
怎么样
while True:
userCode = input('What product would you like? Enter the product code >> ')
try:
if len(str(userCode))!=8:
raise ValueError()
userCode = int(userCode)
except ValueError:
print('The code must be 8 characters long.')
else:
for key, value in list.items():
if userCode == value[0]:
print (key)
我不明白为什么搜索文件中的行需要
;似乎是抄袭错误
无论如何,userCode
永远不等于value
,因为value
是一个元组;但是,它可以等于保存代码的值[0]
怎么样
while True:
userCode = input('What product would you like? Enter the product code >> ')
try:
if len(str(userCode))!=8:
raise ValueError()
userCode = int(userCode)
except ValueError:
print('The code must be 8 characters long.')
else:
for key, value in list.items():
if userCode == value[0]:
print (key)
有几件事需要注意:
请避免使用“列表”作为变量名
无需再次打开数据库文件
在存储细节时,您将它们存储为包含(代码、价格)的元组。因此,要比较用户代码,应该将其与元组的第一个元素进行比较,而不是与整个元组进行比较
代码只是一次又一次地循环,因为没有退出循环的exit语句
有几件事需要注意:
请避免使用“列表”作为变量名
无需再次打开数据库文件
在存储细节时,您将它们存储为包含(代码、价格)的元组。因此,要比较用户代码,应该将其与元组的第一个元素进行比较,而不是与整个元组进行比较
代码只是一次又一次地循环,因为没有退出循环的exit语句
您可能应该避免使用名称list
,因为它会屏蔽内置项,尤其是如果您没有实际使用它来存储列表;)您在代码中有一个永无止境的,而True:
语句,您在每一行上循环,但您将停留在搜索文件中的for行的第一个循环迭代上,而且,值将是一个元组,因此将永远不会与您所测试的字符串相等want@Paradoxis你能解释一下你的评论吗!我将不胜感激!:)设计中有很多缺陷,但Eric Renouf提到了您从未打印密钥的主要原因:您将用户代码与字典中的一个值进行比较,在您的例子中,该值是元组。您可以使用userCode==int(值[0])
来解决它。调试是一项有用的技能,请确保在发生异常情况时检查变量的值。您可能应该避免使用名称list
,因为它会屏蔽内置项,尤其是在您没有实际使用它存储列表时;)您在代码中有一个永无止境的,而True:
语句,您在每一行上循环,但您将停留在搜索文件中的for行的第一个循环迭代上,而且,值将是一个元组,因此将永远不会与您所测试的字符串相等want@Paradoxis你能解释一下你的评论吗!我将不胜感激!:)设计中有很多缺陷,但Eric Renouf提到了您从未打印密钥的主要原因:您将用户代码与字典中的一个值进行比较,在您的例子中,该值是元组。您可以使用userCode==int(值[0])
来解决它。调试是一项非常有用的技能,当发生异常情况时,请确保检查变量的值。当我添加代码28273139
时,它会再次循环到同一个问题您想要什么产品?输入数量后,请输入产品代码>>
。这是因为将userCode
(整数)与值[0]
进行比较将始终失败:值[0]
是原始代码中的字符串。制作字典时将其转换为int,或在比较中使用int(值[0])
。next(数据库).strip()
=>int(next(数据库).strip())
当我添加代码28273139
时,它会再次返回到同一个问题您想要什么产品?输入数量后,请输入产品代码>>
。这是因为将userCode
(整数)与值[0]
进行比较将始终失败:值[0]
是原始代码中的字符串。制作字典时将其强制转换为int,或在比较中使用int(值[0])
。next(数据库).strip()
=>int(ne
database = open("SODatabase.txt", "r")
list = {}
for line in database:
key = line.strip()
code = int(next(database).strip())
price = next(database).strip()
# next(database).strip() # if using python 3.x
list[key] = code, price
while True:
userCode = input('What product would you like? Enter the product code >> ')
if userCode == "":
break
try:
if len(str(userCode)) != 8:
raise ValueError()
userCode = int(userCode)
except ValueError:
print('The code must be 8 characters long.')
else:
for key, value in list.items():
if userCode == value[0]: # code is stored as 1st element of value
print (key)