Python 将字符串与一组与键关联的关键字进行匹配

Python 将字符串与一组与键关联的关键字进行匹配,python,Python,假设我有一个基于用户输入返回的文本文件(歌词)列表: song_1.txt song_2.txt ... song_n.txt 我不喜欢一次列出所有歌曲供用户选择,因此我最初的想法是创建一个简单的函数,将用户输入作为参数,对每首歌曲的预定义关键字列表执行搜索,并返回“最佳匹配歌曲”作为响应 一般来说,我对python和编程相当陌生,到目前为止,我能想到的最好的事情是: keywords={'song_1':['hate','bad','song_2':['love','good']} def按

假设我有一个基于用户输入返回的文本文件(歌词)列表:

song_1.txt
song_2.txt
...
song_n.txt
我不喜欢一次列出所有歌曲供用户选择,因此我最初的想法是创建一个简单的函数,将用户输入作为参数,对每首歌曲的预定义关键字列表执行搜索,并返回“最佳匹配歌曲”作为响应

一般来说,我对python和编程相当陌生,到目前为止,我能想到的最好的事情是:

keywords={'song_1':['hate','bad','song_2':['love','good']}
def按关键字查找歌曲(用户输入):
对于歌曲,关键字.items()中的关键字:
如果用户输入关键字:
返回歌曲+'.txt'
结果=通过关键字(“爱”)查找歌曲
打印(结果)
然后我将从文件中读取一首歌曲并将其返回给用户,但我的问题是:

  • 考虑到我需要追溯“键”这一事实,将字符串与关键字匹配的最佳方法是什么?我有一种感觉,有一种更好的解决方案可以将某些内容与关键字匹配,而不是使用for循环+dictionary和list作为值。只是想在这个问题上寻找一些方向(我希望能有一个与“搜索”相关的链接,也许比这个更深)

对循环使用
没有什么错,特别是当您找到第一个匹配项时退出,这似乎是您所需要的

但是,您也可以获得如下密钥:

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')
如果您必须经常这样做,那么像反转字典这样的解决方案可能是一个好主意,因为您正在交换空间以获得更好的性能,但当然反转操作也需要一些时间,因此它似乎与您的用例不太匹配


User@Barmar确实指出,可以将原始词典创建为“搜索词->文件名”的词典,而不是当前的“文件名->搜索词”。您可能会构建一个词典,其中搜索词作为关键字,与构建当前词典的方式大致相同,具体取决于您计划如何构建词典。

反转词典,并将关键字映射到歌曲<代码>{'hate':'song_1','bad':'song_1','love':'song_2','good':'song_2'}
。然后你可以只获取
关键字。获取(用户输入)
@Barmar-重复的关键字在这里不是一个问题吗?循环每个关键字只找到一首歌,所以重复的歌曲被忽略。你只需要在创建字典时反转一次,而不是每次搜索。当然,但是您必须反转整个字典,然后每次搜索都要访问反转字典,这比搜索原始字典几次成本更高。(除了可能丢失一些信息,但这远远超出OP的问题)字典应该以反向模式创建和更新。
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')