Fuzzywuzzy 用于字典列表

Fuzzywuzzy for a list of dictionaries

我有一个词典列表(API 响应),我使用以下函数搜索某些 民族:

def nation_search(self):
    result = next((item for item in nations_v2 if (item["nation"]).lower() == (f"{self}").lower()), False)
    if result:
        return result
    else:
        return next((item for item in nations_v2 if (item["leader"]).lower() == (f"{self}").lower()), False)

2 个示例:

nations_v2 = [{'nation_id': 5270, 'nation': 'Indo-Froschtia', 'leader': 'Saxplayer', 'continent': 2, 'war_policy': 4, 'domestic_policy': 2, 'color': 15, 'alliance_id': 790, 'alliance': 'Rose', 'alliance_position': 3, 'cities': 28, 'offensive_wars': 0, 'defensive_wars': 0, 'score': 4945, 'v_mode': False, 'v_mode_turns': 0, 'beige_turns': 0, 'last_active': '2020-08-10 04:04:48', 'founded': '2014-08-05 00:09:31', 'soldiers': 0, 'tanks': 0, 'aircraft': 2100, 'ships': 0, 'missiles': 0, 'nukes': 0},
{'nation_id': 582, 'nation': 'Nightsilver Woods', 'leader': 'Luna', 'continent': 4, 'war_policy': 4, 'domestic_policy': 2, 'color': 10, 'alliance_id': 615, 'alliance': 'Seven Kingdoms', 'alliance_position': 2, 'cities': 23, 'offensive_wars': 0, 'defensive_wars': 0, 'score': 3971.25, 'v_mode': False, 'v_mode_turns': 0, 'beige_turns': 0, 'last_active': '2020-08-10 00:22:16', 'founded': '2014-08-05 00:09:35', 'soldiers': 0, 'tanks': 0, 'aircraft': 1725, 'ships': 115, 'missiles': 0, 'nukes': 0}]

我想添加一个使用 fuzzywuzzy 的模糊搜索来获得 5 个可能的匹配项,以防传递给函数的参数中存在拼写错误,但我似乎无法弄清楚。

我只想搜索 nationleader 的值。

如果您需要 5 个可能的匹配项,请使用 process

from fuzzywuzzy import process

def nation_search(self):
    nations_only = [ v2['nation'].lower() for v2 in nations_v2 ]
    leaders_only = [ v2['leader'].lower() for v2 in nations_v2 ]

    matched_nations = process.extract((f"{self}").lower(), nations_only, limit=5)
    matched_leaders = process.extract((f"{self}").lower(), leaders_only, limit=5)

    return matched_nations, matched_leaders