首页 > 解决方案 > 将字符串与与键关联的一组关键字匹配

问题描述

假设我有一个文本文件列表(歌曲歌词)要根据用户输入返回:

song_1.txt
song_2.txt
...
song_n.txt

我对一次列出所有这些供用户选择的想法不满意,所以我最初的想法是创建一个简单的函数,将用户输入作为参数,对预定义的列表执行搜索每首歌的关键字并返回“最佳匹配歌曲”作为响应。

我对python和一般编程还很陌生,到目前为止我能想到的最好的事情是这样的:

keywords = {'song_1': ['hate', 'bad'], 'song_2': ['love', 'good']}

def find_song_by_keyword(user_input):
    for song, keyword in keywords.items():
        if user_input in keyword:
            return song + '.txt'


result = find_song_by_keyword('love')
print(result)
song_2.txt

然后我将从文件中读取一首歌曲并将其返回给用户,但我的问题是:

标签: python

解决方案


使用for-loop 没有任何问题,尤其是当您找到第一个匹配项时退出并且这似乎是您所需要的。

但是,您也可以获得这样的密钥:

result = next((song for song, words in keywords.items() if 'love' in words), None)

或者,如果您不想重复自己并且需要在多个地方使用它,当然只需将其包装在函数定义中:

def find_song_by_keyword(user_input):
    return next((song for song, words in keywords.items() if user_input in words), None)


result = find_song_by_keyword('love')

如果您必须非常频繁地执行此操作,则诸如反转字典之类的解决方案可能是一个好主意,因为您正在交易空间以获得更好的性能,但当然反转操作也需要一些时间,因此它似乎不匹配你的用例很好。

用户@Barmar 确实指出可以将原始字典创建为“搜索词 -> 文件名”而不是当前“文件名 -> 搜索词”的字典。您可以像构建当前词典一样构建以搜索词作为键的词典,具体取决于您计划构建它的方式。


推荐阅读