通过使用不准确/不完整的字符串进行搜索来查找字典中的值

Find a value in a dictionary by searching using an inexact / not complete string

嗨,我正在学习 python,但我遇到了字典问题:

我制作了这本词典,其中包含节目和它们的季数

all_shows = {'Modern family': 3 , 'How I Met Your Mother': 9 , "Modern World" : 12 }

并且我让用户可以通过搜索节目的名称来获取季数

showname = input('<<Enter a show: >>')
season = (all_shows.get(showname))

print (season)

问题是只有当用户输入节目的确切名称时才会返回季数。 我正在尝试解决此问题,因此即使用户写了类似 "Modern" 的内容,他也会获得标题中带有 "modern" 的所有节目(即使他全部用小写)并且他可以 select 哪个节目才是他想要的

我在网上查找并找到了 FuzzyWuzzy。你认为它会帮助我实现我想要的吗?我认为通过使用它,最相似的节目标题将是 selected,所以如果我写“如何遇见母亲”,结果仍将是“9”,如果他写“现代”,则会出现一个列表他可以在哪里 select 显示包含 "modern" 的是他想要的。

我正在寻找的是 fuzzywuzzy 还是有其他方法可以做到这一点?

我个人一直使用 fuzzywuzzy,但这是由一个名为 difflib 的 in-built Python 模块构建的,您可能需要研究一下。 在我看来,fuzzywuzzy 使用起来更简单,而且很可能更能满足您的需求。

您可以使用 edit distance。将字典的所有键与您的输入进行比较,并存储与输入距离最小的键,然后获取该键的值和 return.

import editdistance
import sys
all_shows = {'Modern family': 3 , 'How I Met Your Mother': 9 , "Modern World" : 12 }
def get_seasons(input_str):
    min_dist_key = None
    dist = sys.maxint
    for key in all_shows.keys():
        this_dist = editdistance.eval(key, input_str)
        if this_dist < dist:
            dist = this_dist
            min_dist_key = key
    return all_shows.get(min_dist_key)

此代码可能无法正常工作,但我希望你明白了。

以下代码(纯 python,没有导入,因此简单、直接且快速):

[(x, all_shows.get(x)) for x in all_shows.iterkeys() if "Modern".lower() in x.lower()]

是一个列表推导式,为字典中的每个条目返回一个元组列表,该条目在字符串的任何位置的键中都有 "modern"(大小写 in-sensitive)。

对于您的示例字典 returns:

[('Modern World', 12), ('Modern family', 3)]

您可以用一些变量替换 "Modern".lower(),例如 search_string.lower()

正则表达式是你的朋友。

import re

all_shows = {'Modern family': 3, 'How I Met Your Mother': 9, "Modern World": 12}

input = 'modern'

rs = {x: y for x, y  in all_shows.items() if re.match('.*%s.*' % input, x, re.IGNORECASE)}

print(rs)

输出:

{'Modern World': 12, 'Modern family': 3}

如果用户输入odern,输出仍然是两个名称为Modern XXXX的节目