通过使用不完整/不完整的字符串

时间:2016-01-16 14:59:51

标签: python string dictionary return-value

您好,我正在学习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)

问题是只有当用户写下节目的确切名称时才会返回季节数。 即使用户写了像&#34; Modern&#34;他将获得所有的节目&#34;现代&#34;在标题中(即使他用小写字母写下),他可以选择哪个节目是他想要的节目。

我在网上找到了FuzzyWuzzy。你认为它会帮助我实现我想要的吗?我认为通过使用它,最相似的节目标题将是所选择的,所以如果我写&#34;如何遇见母亲&#34;结果仍然是&#34; 9&#34;如果他写了#34;现代&#34;一个列表将跟随他可以选择哪些节目包含&#34;现代&#34;是他想要的人。

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

4 个答案:

答案 0 :(得分:2)

我个人总是使用fuzzywuzzy,但这是由一个名为difflib的内置Python模块构建的,您可能需要查看它。 在我看来,fuzzywuzzy更易于使用,最有可能更符合您的需求。

答案 1 :(得分:2)

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

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

是一个列表推导,返回字典中每个条目的图表列表,其字符串中任何位置的键中都有“现代”(不区分大小写)。

对于您的示例字典,它返回:

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

您可以将"Modern".lower()替换为某个变量,例如search_string.lower()

答案 2 :(得分:1)

正则表达式是你的朋友。

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,则输出仍为两个节目,其中M odern XXXX作为名称

答案 3 :(得分:0)

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

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)

这段代码可能无效,但我希望你有这个想法。