【问题标题】:Check if a word is in a list that is a value of a dictionary检查一个单词是否在作为字典值的列表中
【发布时间】:2018-05-17 03:02:12
【问题描述】:

我正在尝试检查一个单词是否在作为字典值的列表中。 例如,我想检查 'noodles' 是否在: {1:['hello', 'hallo', 'salut', 'ciao', 'hola'], 2:['eggs', 'noodles', 'bacon']}

我试过了:

element = 'noodles'
element in myDict.values()

但我得到:False

【问题讨论】:

  • values 在这种情况下会返回一个列表列表,不是吗?您可能需要检查每个子列表。 any 在这里可能有用。

标签: python python-3.x list dictionary


【解决方案1】:

您的代码检查 element ('noodles') 是否是字典中的值,而它不是(值是列表)。

您需要检查element 是否在每个列表中。

如果你不关心钥匙:

print(any(element in value for value in myDict.values()))

如果您想知道密钥(这将打印匹配密钥的列表):

print([key for key, value in myDict.items() if element in value])

但是,一般来说,如果您发现自己不得不一遍又一遍地遍历字典,那么您要么选择了错误的键,要么完全使用了错误的数据结构。

【讨论】:

  • 我更喜欢next((key for key, value in myDict.items() if element in value),"KEY_NOT_FOUND")。但是好的答案(是的,dict 中的线性搜索清楚地表明数据组织存在问题)
【解决方案2】:

这里的dict.values() 调用返回一个可迭代的列表。您需要先展平返回的迭代,直接测试:

from itertools import chain

element = 'noodles'
print(element in chain.from_iterable(my_dict.values())) # -> True

【讨论】:

    【解决方案3】:

    myDict.values() 将返回一个列表列表,而不是您可以在 y 中询问 x 的内容,您将无法避免类似于 Python search in lists of lists 的循环。

    ...除非您发现这很耗时并决定保留某种散列以包含 myDict.values 中包含的列表中的所有元素。请注意,每次将 l 插入字典中都会花费 O(len(l))。

    【讨论】:

      【解决方案4】:

      你应该在这里使用一个函数,你可以用纯python来做,而不需要导入任何模块或让它变得更复杂:

      数据:

      Your_dict={1:['hello', 'hallo', 'salut', 'ciao', 'hola'], 2:['eggs', 'noodles', 'bacon']}
      your_word='noodles'
      

      代码:

      def find(dict_1,word):
          for words in dict_1.values():
              if word in words:
                  return True
          else:
              return False
      
      
      
      
      print(find(Your_dict,your_word))
      

      输出:

      True
      

      没有任何 for 循环或模块的单行解决方案:

      只是为了好玩

      print(list(map(lambda x:x if your_word in x else None,Your_dict.values())))
      

      输出:

      [None, ['eggs', 'noodles', 'bacon']]
      

      【讨论】:

        【解决方案5】:
        myDict = {1: ['hello', 'hallo', 'salut', 'ciao', 'hola'], 2: ['eggs', 'noodles', 'bacon']}
        element = 'noodles'
        [print(True) if element in value else None for value in myDict.values()]
        
        # It will give true if it is present
        

        【讨论】:

          【解决方案6】:

          您可以在generator-expression 上使用any()

          any("noodles" in v for v in d.values())
          

          在这种情况下,给出:

          True
          

          为什么?

          d.values() 返回字典 d 中所有值的 iterables。所以在这种情况下,d.values() 的结果将是:

          dict_values([['hello', 'hallo', 'salut', 'ciao', 'hola'], ['eggs', 'noodles', 'bacon']])
          

          然后我们去检查字符串 "noodles" 是否在这些值中的任何一个 (lists) 中。

          这真的很容易/可读。我们只想创建一个 generator 来完全做到这一点 - 即为每个值返回一个 boolean,指示 "noodles" 是否在该 list 中。

          然后,由于我们现在有一个generator,我们可以使用any(),它只会为整个生成器返回一个boolean,指示在迭代它时是否有任何Trues。 所以这在我们的例子中意味着如果"noodles" 在任何values 中。

          【讨论】:

            【解决方案7】:

            你应该使用循环。它肯定会工作。这是经过测试的代码。

            element = 'noodles'
            for i in dict1.values():
                if(element in i):
                    print(True)
                    count+=1
            print(count)
            

            Count 将计算你的元素出现的次数。如果它是 0 则元素不是 在字典的值中可用,如果大于 0,则在字典的值中可用。计数仅供您参考。

            【讨论】:

              【解决方案8】:

              你可以使用dict.items():

              s = {1:['hello', 'hallo', 'salut', 'ciao', 'hola'], 2:['eggs', 'noodles', 'bacon']}
              element = 'noodles'
              if any(element in b for a, b in s.items()):
                 pass
              

              【讨论】:

                【解决方案9】:

                就我而言,我需要检查该词是否存在于键或值中,这是一个简单的解决方案。 (它可能对某人有帮助)

                if 'noodle' in str(myDict):
                    True
                else:
                    False
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-08-18
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-09-16
                  相关资源
                  最近更新 更多