您好,我正在学习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;是他想要的人。
我是在寻找模糊的,还是有其他方法可以做到这一点?
答案 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)
这段代码可能无效,但我希望你有这个想法。