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
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方法可以停止