通过使用不准确/不完整的字符串进行搜索来查找字典中的值
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的节目
嗨,我正在学习 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的节目