Python 从列表中查找包含单词的词典

Python 从列表中查找包含单词的词典,python,if-statement,for-loop,dictionary,Python,If Statement,For Loop,Dictionary,我有一个字典,每个键在一个列表中都有多个值。 这些任务是: 检测给定单词是否在字典值中 如果为true,则从字典中返回相应的键 任务1通过使用if条件实现: if (word in dictionary[topics] for topics in dictionary.keys()) 我想在if条件计算为True时获取主题。差不多 if (word in dictionary[topics] for topics in dictionary.keys()): print topics

我有一个字典,每个键在一个列表中都有多个值。 这些任务是:

  • 检测给定单词是否在字典值中
  • 如果为true,则从字典中返回相应的键
  • 任务1通过使用if条件实现:

    if (word in dictionary[topics] for topics in dictionary.keys())
    
    我想在if条件计算为True时获取主题。差不多

    if (word in dictionary[topics] for topics in dictionary.keys()):
       print topics
    

    您可以使用列表理解(类似于压缩的
    for
    循环)。它们更易于编写,在某些情况下计算速度更快:

    topiclist = [topic for topic in dictionary if word in dictionary[topic]]
    
    您不需要
    dictionary.keys()
    ,因为
    dict
    已经是一个iterable对象;无论如何,迭代它都会产生键,而且(在Python 2中)比
    dictionary.keys()
    更有效

    编辑: 下面是另一种方法(它避免了额外的字典查找):

    避免额外的字典查找可能会使它更快,尽管我还没有测试过它

    在Python 2中,为了提高效率,您可能需要执行以下操作:

    topiclist = [topic for (topic, tlist) in dictionary.iteritems() if word in tlist]
    

    您可以使用列表理解(类似于压缩的
    for
    循环)。它们更易于编写,在某些情况下计算速度更快:

    topiclist = [topic for topic in dictionary if word in dictionary[topic]]
    
    您不需要
    dictionary.keys()
    ,因为
    dict
    已经是一个iterable对象;无论如何,迭代它都会产生键,而且(在Python 2中)比
    dictionary.keys()
    更有效

    编辑: 下面是另一种方法(它避免了额外的字典查找):

    避免额外的字典查找可能会使它更快,尽管我还没有测试过它

    在Python 2中,为了提高效率,您可能需要执行以下操作:

    topiclist = [topic for (topic, tlist) in dictionary.iteritems() if word in tlist]
    
    上行的问题是,您正在创建一个生成器对象,用于评估
    word
    是否位于
    dictionary
    的每个值中,并为每个值返回bool。由于非空列表始终为true,因此无论单词是否在值中,该if语句都将始终为true。你可以做两件事:

    • 使用
      any()
      将使您的
      if
      语句起作用:

      if any(word in dictionary[topics] for topics in dictionary.keys()):
      
    但是,这并不能解决捕获键值的初始问题。因此:

    • 使用使用预定义(我假设)变量
      word
      作为排序过滤器的实际列表理解:

      keys = [topics for topics in dictionary if word in dictionary[topics]]
      

    • 使用
      filter()

    它们都做同样的事情。提醒您迭代
    字典
    dictionary.keys()
    是等效的

    请注意,这两种方法都返回一个包含
    word
    值的所有键的列表。使用常规列表项访问每个键

    上行的问题是,您正在创建一个生成器对象,用于评估
    word
    是否位于
    dictionary
    的每个值中,并为每个值返回bool。由于非空列表始终为true,因此无论单词是否在值中,该if语句都将始终为true。你可以做两件事:

    • 使用
      any()
      将使您的
      if
      语句起作用:

      if any(word in dictionary[topics] for topics in dictionary.keys()):
      
    但是,这并不能解决捕获键值的初始问题。因此:

    • 使用使用预定义(我假设)变量
      word
      作为排序过滤器的实际列表理解:

      keys = [topics for topics in dictionary if word in dictionary[topics]]
      

    • 使用
      filter()

    它们都做同样的事情。提醒您迭代
    字典
    dictionary.keys()
    是等效的


    请注意,这两种方法都返回一个包含
    word
    值的所有键的列表。使用常规列表项访问每个键。

    听起来您要搜索的单词只能在一个键中找到。对吗

    如果是这样,您可以在字典的键值对上迭代,直到找到包含搜索词的键

    对于Python 2:

    found = False
    for (topic, value) in dictionary.iteritems():
        if word in topic:
            found = True
            print topic
            break
    

    对于Python3,只需将
    iterms()
    替换为
    items()

    ,听起来您要搜索的单词似乎只在一个键中找到。对吗

    如果是这样,您可以在字典的键值对上迭代,直到找到包含搜索词的键

    对于Python 2:

    found = False
    for (topic, value) in dictionary.iteritems():
        if word in topic:
            found = True
            print topic
            break
    

    对于Python 3,只需将
    iterms()
    替换为
    items()

    看看“列表理解”(奇奇外观教程)谢谢@PaulRichter,该教程非常有用。看看“列表理解”(奇奇外观教程)谢谢@PaulRichter,该教程非常有用。如果单词在值中出现多次,我只是使用result的第一个元素,
    topiclist[0]
    来获取第一个值。或者,如果if条件的计算结果为
    True
    @blueBeetle,是否有任何pythonic方法可以停止:您可以使用生成器理解而不是列表理解。它被懒散地评估。如果没有找到任何内容,则需要从生成器中安全地提取更多内容,而列表只需要一个简单的检查,如
    if-topiclist:#然后执行一些操作
    ,因为如果列表包含任何值,则列表为“true”。生成器的工作方式有点不同,因为它们是惰性评估的。如果生成器为空,则从生成器中提取单个元素需要使用
    try/except
    语句。如果您愿意,我可以添加生成器理解作为一个附加示例。@blueBeetle:或者如果您只需要第一个匹配,一个简单的
    for
    循环可能是最好的。如果您愿意,我也可以将其添加到答案中。如果单词在值中出现多次,我只是使用result的第一个元素,
    topiclist[0]
    来获取第一个值。或者,如果if条件的计算结果为
    True
    @blu,是否有任何pythonic方法可以停止