Python 字典代码只是一次又一次地循环

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

我有一个文本文件,我正在为一个名为“Bodn's Superstore”的模拟商店设计。
我设计了一个.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)