【问题标题】:Iterating over a dictonary to find value from a key, value pair遍历字典以从键值对中查找值
【发布时间】:2021-10-06 15:05:46
【问题描述】:

我正在尝试创建一个循环,将用户输入的输入与定义的字典中的键相匹配,并将相应的值作为输出返回。但是,当用户输入的内容不在键中时,程序会打印 None 并终止。但是我希望程序继续让用户输入输入,直到它在其中一个键上找到匹配项,并且只有当用户提供了字典中存在的输入键时它才应该终止。我是 Python 新手,所以不确定如何使用 while 语句来循环该过程。感谢任何帮助。

list_dict = {"James" : "Pen Set", "Tim" : "Geometry Box", "Rocky" : "Sticky Notes" , "Jeff" : "Alarm Clock" , "Sandy" : "Highlighters"}
_name = input("Enter Name: ")
x = list_dict.get(_name)
while x == None:
  _name = input("Re-Enter Name: ")
  x = list_dict.get(_name)
  break
else:
  print(_name, "got", x)
break

【问题讨论】:

  • 删除break

标签: python loops dictionary while-loop


【解决方案1】:

您在没有任何条件的情况下直接在 while 循环内使用 break 关键字。结果是循环内容在退出循环之前只能运行一次。如果您希望保持循环运行,请删除 break 关键字。

以下是您问题的示例答案:

list_dict = {"James" : "Pen Set", "Tim" : "Geometry Box", "Rocky" : "Sticky Notes" , "Jeff" : "Alarm Clock" , "Sandy" : "Highlighters"}

# first input
_name = input("Enter Name: ")
# obtain x
x = list_dict.get(_name)

# perform checking on the latest value of x
while x == None:
  _name = input("Re-Enter Name: ")
  x = list_dict.get(_name)
  # if x is a valid value, the while statement above will detect this and terminate the loop

# final output
print(_name, "got", x)

备注1:请记住,通过正确设置循环条件,可以自动终止循环。通常建议不要随意使用 breakcontinue 关键字,因为这会破坏正常的程序流程。

备注 2:在同一级别使用 else 关键字和 while 关键字意味着 else 块仅在 while 循环完成执行且没有任何中断的情况下执行,即永远不会遇到 break 关键字.这不适用于您的情况,因为终止条件很简单,无需检测while循环是否中断。

【讨论】:

  • 谢谢!也不知道这个,只是查看了文档,使用起来非常方便。但是,此功能太先进,无法在这种情况下适用。
  • 编辑了我的答案以包括@MisterMiyagi 的更正
【解决方案2】:

问题在于break语句。如果你删除它,程序应该可以正常工作;)

【讨论】:

    【解决方案3】:

    提供的代码只需稍作更改即可产生您期望的行为。在以下修改后的代码中,两个break 语句都已被删除:

    list_dict = {"James" : "Pen Set", "Tim" : "Geometry Box", "Rocky" : "Sticky Notes" , "Jeff" : "Alarm Clock" , "Sandy" : "Highlighters"}
    _name = input("Enter Name: ")
    x = list_dict.get(_name)
    while x == None:
      _name = input("Re-Enter Name: ")
      x = list_dict.get(_name)
      # break
    else:
      print(_name, "got", x)
    # break
    

    说明

    • 删除第一个break 以防止while 循环在第一次迭代后总是退出。如果list_dict 中不存在用户提供的名称,我们希望while 循环继续迭代。通过放置break,我们强制while 循环在第一次迭代后退出。同样重要的是要注意break 会导致else 子句被跳过。使用原代码,如果输入的第一个名字不存在,但输入的第二个名字存在,break 会导致else 子句被跳过,print 语句不会被执行。
    • 删除第二个break,因为它仅在放置在循环内时适用。

    有关更多信息,请参阅 documentation 以获取 break 语句。

    测试修改后的代码

    Enter Name: TestName1
    Re-Enter Name: TestName2
    Re-Enter Name: Jeff
    Jeff got Alarm Clock
    

    【讨论】:

      【解决方案4】:

      我改进了你的一些代码,我认为这有助于解决你的问题。

      list_dict = {"James" : "Pen Set", "Tim" : "Geometry Box", "Rocky" : 
      "Sticky Notes" , "Jeff" : "Alarm Clock" , "Sandy" : "Highlighters"}
      _name = input("Enter Name: ")
      
      while _name not in list_dict.keys():
         _name = input("Re-Enter Name: ")
      print(f'{_name} got {list_dict.get(_name)}')
      

      【讨论】:

      • 您可以通过将检查从 if 移动到 while,完全删除 if/else/break 来改善这一点。请注意,如果您确定密钥存在,您可以直接检查_name not in list_dict 并以list_dict[_name] 访问该值。
      • 编辑了我的答案以包括@MisterMiyagi 更正
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 2014-06-18
      • 2015-08-07
      • 1970-01-01
      相关资源
      最近更新 更多