字典

时间:2016-06-25 16:10:32

标签: python dictionary while-loop keyerror

我在我的代码中使用字典并将用户的输入与它进行比较,但是当用户输入任何内容并且只是点击进入时,程序会失败并给我一个关键错误。我尝试使用'尝试和除外'但是这样程序循环到我不想要的开头,我想让程序保持在子循环中,直到用户输入边界内的东西。

ftablet=open("tablet.txt").readlines() devicelist=["phone","tablet"]

dtablet = {}

for line in ftablet:
       (key,val) = line.split(":")
       dtablet[str(key)] = val.strip(",")    

while True:    
   counter=0    
   device=""

   while device not in (devicelist):
      device=input(What is your device?: ").lower().replace(" ","")
      print()


   if device == "tablet": 
      usermodel=""

      while usermodel != (dtablet["phonemodels"]): 
         print(dtablet["modelquestion"])
         usermodel=input("Enter MODEL Here: ").lower().replace(" ","")

         if usermodel in (dtablet["phonemodels"]):
            name=""

            while name != (dtablet[usermodel]):
               print(dtablet["namequestion"])
               print("Enter any of these : ",(dtablet[model]))
               name=input("Enter NAME Here: ").upper().replace(" ","")

               if name in (dtablet[usermodel]):
                  storage=""

                  while storage != (dtablet[name]):
                     print(dtablet["storagequestion"])
                     print("Enter any of these : ",(dtablet[name]))
                     storage=input("Enter STORAGE Here: ").upper().replace(" ","")

                     if storage in (dtablet[name]):
                        problem=input("What is the PROBLEM with your tablet?\nEnter Here: ").upper()
                        print()

                        for word in problem.split():
                           if word in (dtablet[storage]):
                              print(dtablet[word])
                              print("Thanks for using my troubleshooting program")
                              counter=1
                        if counter==0:
                           print("We dont have your keyword in out database")
   else:
      print("Sorry! We do not have that device in out database please choose from the ones listed above.")

这是我的文本文件,我将其转换为字典,称为' dtablet'。

  

modelquestion:你的平板电脑的型号是什么?

     

namequestion:平板电脑的名称是什么?

     

storagequestion:平板电脑的存储是什么?

     

问题:你的平板电脑有什么问题?

     

phonemodels:苹果,三星,索尼

     

苹果:IPAD1,IPAD2,IPAD3

     

三星:TAB1,TAB2,TAB3

     

索尼:XPERIAZ2,XPERIAZ3,XPERIAZ4

     

IPAD1:16GB,32GB,64GB

     

IPAD2:16GB,32GB,64GB

     

IPAD3:16GB,32GB,64GB

     

TAB1:16GB,32GB,64GB

     

TAB2:16GB,32GB,64GB

     

TAB3:16GB,32GB,64GB

     

XPERIAZ1:16GB,32GB,64GB

     

XPERIAZ2:16GB,32GB,64GB

     

XPERIAZ3:16GB,32GB,64GB

     

16GB:龟裂,破

     

32GB:龟裂,破

     

64GB:龟裂,破

     

CRACKED:问题=破解解决方案=带手机进行维修   店

     

BROKEN:问题=破解解决方案=将手机带到维修店

4 个答案:

答案 0 :(得分:0)

您的问题是您没有在密钥"model"周围加上引号。这意味着它无论如何也无法找到它。

另外,为什么不让它保持一个循环?它会更有效率。

答案 1 :(得分:0)

你们俩都有

dtablet[model]   # the key is the model variable

dtablet["model"] # the key is the "model" string

在您的代码中,这是故意的吗?

如果用户按下'输入'然后model将是一个空字符串,这个表达式:

model in dtablet[model]
如果dtablet [model]是一个字符串,

将永远为真。

答案 2 :(得分:0)

首先,您的词典中没有“模型”键。您可以打印dtablet.keys()并查找是否有“模型”。如果没有,则dtablet [“model”]将100%返回KeyError。

其次,当你输入while model != (dtablet["model"]):时,因为model是一个空字符串,如果dtablet [“model”]是一个字符串,那么它不会进入while循环,因为空字符串总是任何字符串的子字符串。

答案 3 :(得分:0)

您确实意识到while循环同时包含break选项和continue选项吗? 如果您希望将程序保留在子循环中,直到用户输入边界内的某些内容为止。测试和continue如果输入不是你想要的。