python - 将字符串与与键关联的一组关键字匹配
问题描述
假设我有一个文本文件列表(歌曲歌词)要根据用户输入返回:
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
然后我将从文件中读取一首歌曲并将其返回给用户,但我的问题是:
- 考虑到我需要追溯“键”这一事实,将字符串与关键字匹配的最佳方法是什么?我觉得有一个更好的解决方案来匹配关键字,而不是使用 for 循环 + 字典和列表作为值。只是在一般情况下寻找一些关于这个问题的方向(我很感激一个与“搜索”相关的东西的链接,也许比这更深层次的东西)。
解决方案
使用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 确实指出可以将原始字典创建为“搜索词 -> 文件名”而不是当前“文件名 -> 搜索词”的字典。您可以像构建当前词典一样构建以搜索词作为键的词典,具体取决于您计划构建它的方式。
推荐阅读
- node.js - app.get('/') 数据不会显示在相同的 url 中使用 app.use('/') 在 express
- angular - 无法从 ngrx/store 取消订阅 ActionsSubject
- python - 本地python 3.6?
- azure-devops - 从用户删除 VSE 订阅后,将 VSEnterprise 订阅访问级别更改为基本
- python - 如何吞下 python 异常消息?
- bash - 用 bash 创建的文件中的奇怪符号
- java - 为 Big Decimal 生成动态比例
- java - 无法在 spring + maven + tomcat 中从配置文件开始
- vue.js - VUE 从子页面滚动到索引页面锚点
- php - 像真正的浏览器一样的 PHP 中的 Curl 仍然被检测为机器人