【问题标题】:How do I print False once and stop printing False for all the keys in a dictionary?如何打印一次 False 并停止为字典中的所有键打印 False?
【发布时间】:2021-10-11 14:39:00
【问题描述】:

我想制作一个函数,让某人猜测字典中任何键的值,并找出它们是对还是错。如果该键存在于字典中并且该值是正确的值,则该函数应返回 true。在所有其他情况下,它应该返回 false。但它不仅会为字典中的每个键打印 False 一次。谢谢。

WaywardSonDict = {"Artist":"Kansas","Song":"Carry on Wayward Son","Genre":"Hard Rock","Album":"Leftoverture","Writer":"Kerry Livgren"}

def valueDict(key,value):
    for i, j in WaywardSonDict.items():
        if i == key and j == value:
            print(True)
        else:
            print(False)

valueDict("Genre","Hard Rock")

【问题讨论】:

  • 检查键是否存在然后检查其值比遍历字典中的项目更有效。至于为什么打印 false 是因为您检查了字典中的每个密钥对,所以有一堆不匹配
  • 你熟悉return吗?用您自己的话说,什么是函数,以及为什么要使用它们?

标签: python function loops dictionary


【解决方案1】:

扩展not_speshal's answer

导致多个布尔打印的原因是什么?

您的代码中的问题是:

  • 在循环中打印将为 dict 中的每个条目打印
  • 不返回,表示遍历整个字典

迭代求解

您可以解决这些问题、改进代码并一步一步地学习(迭代地)。

1。让它返回

# rename from `valueDict` to a question in order to signal boolean return
def hasKeyWithValue(key,value):
    for i, j in WaywardSonDict.items():
        if i == key and j == value:
            return True
        # no else, simply continue looping to the end
    return False  # if not found and returned, finally return False


print(hasKeyWithValue('Genre', 'Hard Rock') # prints: True

设计建议:重命名函数来表示预期的布尔值。这可以通过将其命名为 question 来完成。

2。使用 dict 的 getter 函数代替循环

def hasKeyWithValue(key,value):
    if WaywardSonDict.get(key) == value:
        return True
    else:
        return False

那么你需要一个完整的 if-else。 或者,您可以将 else 替换为 default 返回:

def hasKeyWithValue(key,value):
    if WaywardSonDict.get(key) == value:
        return True  # that's the "unexpected"
    return False  # that's the default

注意:这里是.get is special,因为如果没有找到密钥,它会返回None。 这允许像 hasKeyWithValue('Year',None) 这样的不存在检查,它将返回 True,因为给定的字典没有带有键 Year 的条目。

3。简化 if-return

def hasKeyWithValue(key,value):
    return (WaywardSonDict.get(key) == value)

简化测试。 if-else 语句已过时,因为布尔表达式(括号内)的计算结果为 True 或 False。

4。内联简单测试

key = 'Genre'
value = 'Hard Rock'

print(WaywardSonDict.get(key) == value)

因此,hasKeyWithValue 函数已被一个简短的语义词典测试(大多数 Python 开发人员都能理解)取代。

5。提高可读性

# format like a table to ease reading
WaywardSonDict = {
    "Artist" : "Kansas",
    "Song"   : "Carry on Wayward Son",
    "Genre"  : "Hard Rock",
    "Album"  : "Leftoverture",
    "Writer" : "Kerry Livgren"
}

通过这种方式,您可以像检查清单一样轻松扫描字典条目。

【讨论】:

    【解决方案2】:

    一个简单的方法是设置一个布尔变量,默认设置为 False,如果找到匹配项,则更改为 True。然后,您只需在最后打印出变量:

    WaywardSonDict = {"Artist":"Kansas","Song":"Carry on Wayward Son","Genre":"Hard Rock","Album":"Leftoverture","Writer":"Kerry Livgren"}
    
    def valueDict(key,value):
        guessed = False
        for i, j in WaywardSonDict.items():
            if i == key and j == value:
               guessed = True
               break
        print(guessed)
    

    【讨论】:

    • 通过初始化像guessed = False这样的finder-variable来defaulting是一个有用的模式。并且建议的代码将您的多个布尔打印输出减少到一个最终结果。对于每个循环,考虑退出条件(何时停止)!这里:如果在第一次迭代后已经找到了,你真的需要进一步搜索和测试吗?
    • 没错,我只是添加一个break语句
    【解决方案3】:

    您当前正在使用 for each 循环遍历列表中的每个值,以检查它是否同时具有您要查找的键和值。使用字典的部分吸引力在于您不必遍历它来查找所需的键/值对,您可以通过使用WaywardSonDict["Genre"] 对其进行索引来获取所需条目的值。

    在您的实例中,代码可以是:

    if key in WaywardSonDict && WaywardSonDict[key] == value:
        return true;
    return false;
    

    【讨论】:

      【解决方案4】:

      您在循环的每次迭代中都打印 True/False。相反,您可以 return 在有匹配项时返回 True,在循环结束时返回 False(即,当没有匹配项时):

      def valueDict(key, value):
          for k in WaywardSonDict:
              if k == key and WaywardSonDict[k] == value:
                  return True
          return False
      

      或者,您可以使用.get,而不是循环遍历整个字典,如果字典中不存在该键,则返回None

      def valueDict(key, value):
          if WaywardSonDict.get(key)==value:
              return True
          return False
      

      【讨论】:

      • 总结一下聪明之处:如果 [.get]() 返回None,您不必测试密钥是否存在并且之前匹配k == key。好处:摆脱for循环并简化。对吗?
      • @hc_dev - 正确!
      • 字典的全部意义在于您可以查找一个键而无需遍历所有键。 循环遍历整个字典首先违背了拥有字典的目的。您的“或者...”应该是第一个(并且仅限于 IMO)答案。
      • @PranavHosangadi - 我尝试尽可能少地更改 OP 的原始代码,以便他们知道哪里出了问题。 “替代”解决方案只是教他们更好的方法。
      【解决方案5】:
      def is_in_wayword_son_dict(key, value):
          if WaywordSonDict.get(key, '') == value:
              return True
          return False   
      

      如果存在,则从字典中获取key的值,与传递的值进行比较,如果匹配则返回true,否则返回false。

      【讨论】:

        【解决方案6】:

        给你:

        WaywardSonDict = {"Artist":"Kansas","Song":"Carry on Wayward Son","Genre":"Hard Rock","Album":"Leftoverture","Writer":"Kerry Livgren"}
        
        def valueDict(key,value):
            if (key,value) in WaywardSonDict.items():
                print('True')
            else:
                print('False')
        
        valueDict("Genre","Hard Rock")
        

        输出

        True
        

        【讨论】:

          猜你喜欢
          • 2019-04-18
          • 1970-01-01
          • 1970-01-01
          • 2018-05-16
          • 2018-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多