Python實(shí)現(xiàn)json對(duì)值進(jìn)行模糊搜索的示例詳解
我經(jīng)常使用json進(jìn)行存儲(chǔ)配置,于是常常遇到這樣的問題:如果想要對(duì)某個(gè)數(shù)組里的值進(jìn)行模糊搜索,同時(shí)輸出相關(guān)的其他數(shù)組相同位置的的值該如何實(shí)現(xiàn)呢?
思路
代入實(shí)際案例來思考一下我的解法
數(shù)據(jù)
{ "name": [ "電飯煲版廣式臘腸煲飯", "電飯煲燒雞", "電飯煲燜面"], "ingredients": [ "臘腸、米", "雞肉、洋蔥、菌菇", "豬肉、面食"], "url": [ "https://www.***.com/video/BV1NE411Q7Jj", "https://www.***.com/video/BV1T54y1U7Cu", "https://www.***.com/video/BV14b411q7rM" "https://www.***.com/video/BV1K441157rz"], "difficulty": [ "簡(jiǎn)單", "簡(jiǎn)單", "簡(jiǎn)單"], "tag": [ "廣式", "好吃", "健康餐"], "practice": [ "炒", "燒", "蒸" ""], "tool": [ "電飯煲", "電飯煲", "電飯煲" ""] }
這是一個(gè)菜譜json。
假如我現(xiàn)在被隔離在家了,手頭上只有零星的食材,我想根據(jù)手頭上的食材來看看我都能做出什么菜。
那么這該如何實(shí)現(xiàn)呢?
解法一
假如已知我手上的食物有牛肉、洋蔥。那么我可以這樣實(shí)現(xiàn)
- 遍歷json,然后分別創(chuàng)建數(shù)組變量存儲(chǔ)name、ingredients、url、difficulty等json數(shù)組內(nèi)容
- 遍歷ingredients數(shù)組,模糊匹配是否與我手頭上的食物一致
- 如果一致,將數(shù)據(jù)加入新的數(shù)組中,同時(shí)把相同位置的name、url、difficulty等json數(shù)組內(nèi)容也分別加入新的數(shù)組中
- 同時(shí)輸出各個(gè)數(shù)組的內(nèi)容
顯而易見,這種解法太呆了,于是我想還有哪里可以優(yōu)化呢?
解法二
于是我又想到了另一種寫法
- 只遍歷一次json并存儲(chǔ),然后再存儲(chǔ)一組需要模糊匹配的內(nèi)容數(shù)組(這個(gè)內(nèi)容數(shù)組可以是你想匹配的任何值所在的對(duì)應(yīng)數(shù)組,例如想模糊匹配菜名,就只需要存儲(chǔ)name數(shù)組,想模糊匹配食材,就只需要存儲(chǔ)ingredients數(shù)組)
- 模糊匹配是否與我手頭上的食物一致并記錄下位置
- 通過位置取其他相關(guān)的其他數(shù)組相同位置的的值
這個(gè)解法的關(guān)鍵在于,因?yàn)楦鱾€(gè)數(shù)組的長(zhǎng)度相同,所以獲取一次位置即可同時(shí)知道其他對(duì)應(yīng)數(shù)值所在的對(duì)應(yīng)數(shù)組中的位置
說的有點(diǎn)繞,直接上代碼。
代碼實(shí)現(xiàn)
首先取菜譜數(shù)據(jù)
# 取菜譜json def get_record(): url = "./menu.json" if not os.path.isfile(url): return "菜譜獲取失敗" fo = open(url, "r", encoding='utf-8') ele_json = loads(fo.read()) return ele_json
模糊搜索實(shí)現(xiàn)
# 模糊搜索 def fuzzyfinder(user_input, collection_key_list): suggestions = [] pattern = '.*?'.join(user_input) # Converts 'djm' to 'd.*?j.*?m' regex = compile(pattern) # Compiles a regex. a = 0 for item in collection_key_list: match = regex.search(item) # Checks if the current item matches the regex. if match: suggestions.append(a) a = a + 1 return suggestions
user_input 和 collection_key_list 分別表示 關(guān)鍵字 和 欲模糊匹配的數(shù)組suggestions數(shù)組 存儲(chǔ)了模糊匹配上了的數(shù)值的位置
最后根據(jù)實(shí)際情況進(jìn)行數(shù)據(jù)取出使用即可。
在本例子里,就是取出菜譜
def get_cook(key): # 進(jìn)一步解析資源json al_dict = get_record() collection_key = [] # 用來模糊匹配的key for b in al_dict['ingredients']: collection_key.append(b) fuzzyfinder_i_list = fuzzyfinder(key, collection_key) # 模糊搜索資源 fuzzyfinder_i_len = len(fuzzyfinder_i_list) if fuzzyfinder_i_len > 0: if collection_key[fuzzyfinder_i_list[0]].replace("、", "") == key.replace("、", ""): return "".join([al_dict['name'][fuzzyfinder_i_list[0]], "丨", al_dict['ingredients'][fuzzyfinder_i_list[0]], "\nB站教程BV號(hào):", al_dict['url'][fuzzyfinder_i_list[0]], "\n難度:", al_dict['difficulty'][fuzzyfinder_i_list[0]], "丨標(biāo)簽:", al_dict['tag'][fuzzyfinder_i_list[0]], "\n方法:", al_dict['practice'][fuzzyfinder_i_list[0]], "丨工具:", al_dict['tool'][fuzzyfinder_i_list[0]]]) elif collection_key[fuzzyfinder_i_list[fuzzyfinder_i_len - 1]].replace("、", "") == key.replace("、", ""): return "".join([al_dict['name'][fuzzyfinder_i_list[fuzzyfinder_i_len - 1]], "丨", al_dict['ingredients'][fuzzyfinder_i_list[fuzzyfinder_i_len - 1]], "\nB站教程BV號(hào):", al_dict['url'][fuzzyfinder_i_list[fuzzyfinder_i_len - 1]], "\n難度:", al_dict['difficulty'][fuzzyfinder_i_list[fuzzyfinder_i_len - 1]], "丨標(biāo)簽:", al_dict['tag'][fuzzyfinder_i_list[fuzzyfinder_i_len - 1]], "\n方法:", al_dict['practice'][fuzzyfinder_i_list[fuzzyfinder_i_len - 1]], "丨工具:", al_dict['tool'][fuzzyfinder_i_list[fuzzyfinder_i_len - 1]]]) else: re_text = "未找到精準(zhǔn)關(guān)鍵詞,模糊搜索到以下內(nèi)容:\n" for c in fuzzyfinder_i_list: re_text = "".join( [re_text, al_dict['name'][c], "丨", al_dict['ingredients'][c], "\nB站教程BV號(hào):", al_dict['url'][c], "\n難度:", al_dict['difficulty'][c], "丨標(biāo)簽:", al_dict['tag'][c], "\n方法:", al_dict['practice'][c], "丨工具:", al_dict['tool'][c], "\n"]) return re_text else: content = "".join(["未找到" + key + "相關(guān)菜譜"]) return content
這個(gè)寫法可以同時(shí)解決精準(zhǔn)匹配和模糊匹配問題,精準(zhǔn)匹配結(jié)果一般是數(shù)組第一個(gè)或最后一個(gè),所以只需要判斷一下首尾是否與關(guān)鍵字相同即可
結(jié)果
來看一下效果
精準(zhǔn)匹配
if __name__ == "__main__": print(get_cook("胡蘿卜、牛肉、洋蔥")) >>>胡蘿卜燉牛肉丨胡蘿卜、牛肉、洋蔥 >>>B站教程BV號(hào):https://www.***.com/video/BV1UR4y1V7nV >>>難度:困難丨標(biāo)簽:法式 >>>方法:燉丨工具:一口大鍋
模糊匹配
if __name__ == "__main__": print(get_cook("牛肉、洋蔥")) >>>未找到精準(zhǔn)關(guān)鍵詞,模糊搜索到以下內(nèi)容: >>>電飯煲羅宋湯丨牛肉、番茄、洋蔥、芹菜、胡蘿卜、土豆、卷心菜 >>>B站教程BV號(hào):https://www.***.com/video/BV16Q4y1m7nU >>>難度:簡(jiǎn)單丨標(biāo)簽:雜燴 >>>方法:丨工具:電飯煲 >>>胡蘿卜燉牛肉丨胡蘿卜、牛肉、洋蔥 >>>B站教程BV號(hào):https://www.***.com/video/BV1UR4y1V7nV >>>難度:困難丨標(biāo)簽:法式 >>>...
問題解決
到此這篇關(guān)于Python實(shí)現(xiàn)json對(duì)值進(jìn)行模糊搜索的示例詳解的文章就介紹到這了,更多相關(guān)Python json值模糊搜索內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用python調(diào)用llama3進(jìn)行對(duì)話的操作步驟
Meta?已將最新的?LLaMa3?進(jìn)行了開源,因此,我們也可以方便的使用?Python?進(jìn)行?LLaMa3?模型的調(diào)用和開發(fā),本文給大家介紹了如何使用?python?調(diào)用?llama3?進(jìn)行對(duì)話,需要的朋友可以參考下2024-09-09pygame編寫音樂播放器的實(shí)現(xiàn)代碼示例
這篇文章主要介紹了pygame編寫音樂播放器的實(shí)現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11DJANGO-URL反向解析REVERSE實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于DJANGO-URL反向解析REVERSE的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-10-10利用Python實(shí)現(xiàn)面部識(shí)別的方法詳解
人臉識(shí)別正在成為軟件開發(fā)中的一種趨勢(shì)。它有助于識(shí)別人臉并使應(yīng)用程序更加健壯。本文將使用python和face_recognition庫(kù)創(chuàng)建一個(gè)簡(jiǎn)單的人臉識(shí)別,需要的可以參考一下2022-05-05全面了解Python的getattr(),setattr(),delattr(),hasattr()
下面小編就為大家?guī)硪黄媪私釶ython的getattr(),setattr(),delattr(),hasattr()。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06關(guān)于CUDA out of memory的解決方案
這篇文章主要介紹了關(guān)于CUDA out of memory的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02python 尋找優(yōu)化使成本函數(shù)最小的最優(yōu)解的方法
這篇文章主要介紹了python 尋找優(yōu)化使成本函數(shù)最小的最優(yōu)解的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12