【问题标题】:Find which dictionaries from a list contain word从列表中查找哪些字典包含单词
【发布时间】:2016-03-04 10:02:31
【问题描述】:

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

  1. 检测给定单词是否在字典值中
  2. 如果为真,则从字典中返回相应的键

任务 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

【问题讨论】:

  • 看看“列表推导式”(俗气的教程here
  • 感谢@PaulRichter,这个教程非常有用。

标签: python if-statement for-loop dictionary


【解决方案1】:

您可以使用列表推导(类似于压缩的for 循环)。它们编写起来更简单,并且在某些情况下计算速度更快:

topiclist = [topic for topic in dictionary if word in dictionary[topic]]

您不需要dictionary.keys(),因为dict 已经是一个可迭代对象;无论如何迭代它都会产生密钥,并且(在 Python 2 中)以比dictionary.keys() 更有效的方式。

编辑: 这是解决此问题的另一种方法(它避免了额外的字典查找):

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

虽然我没有测试过,但避免额外的字典查找可能会使其更快。

在 Python 2 中,为了提高效率,您可能想要这样做:

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

【讨论】:

  • 如果单词在值中出现多次,我只是使用结果的第一个元素topiclist[0] 来获取第一个值。或者一旦if条件评估为True,是否有任何pythonic方法停止。
  • @blueBeetle:您可以使用生成器推导而不是列表推导。它被懒惰地评估。如果碰巧没有找到任何东西,它需要更多的时间来安全地从生成器中提取,而列表只需要像if topiclist: # then do something 这样的简单检查,因为如果列表包含任何值,则它们是“真”的。生成器的工作方式有点不同,因为它们是惰性求值的。从生成器中提取单个元素需要try/except 语句以防生成器为空。如果您愿意,我可以添加生成器理解作为附加示例。
  • @blueBeetle:或者如果你只想要第一场比赛,一个简单的for 循环可能是最好的。如果您愿意,我也可以将其添加到答案中。
【解决方案2】:
if (word in dictionary[topics] for topics in dictionary.keys())

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

  • 使用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()

    keys = filter(lambda key: word in dictionary[key],dictionary)
    

它们都做同样的事情。提醒一下,遍历 dictionarydictionary.keys() 是等价的

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

【讨论】:

    【解决方案3】:

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

    如果是这样,您可以遍历字典的键值对,直到找到包含搜索词的键。

    对于 Python 2:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-13
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多