问题描述
我有一本结构如下的字典:
{
'www.site.sx/file1.html' : 'TITLE1 101 Project Caspian',
'www.site.sx/file2.html' : 'TITLE2 102 Filter Spencer'
}
我希望能够使用户只需在title2 102
键入以匹配此处的第二个条目,以便程序可以从关联的链接获取资源。
如何使用用户输入的值用通配符匹配搜索字典?
例:
用户输入
title1 101
也许
Title1 101
现在,我该如何使用/对此进行解析以获得字典中的匹配项?
nb-区分大小写很重要...
1楼
如果可能,最好重组数据:
DATA = {
'title1 101': ('www.site.sx/file1.html', 'Project Caspian'),
'title2 102': ('www.site.sx/file2.html', 'Filter Spencer'),
}
然后,这是一个简单的情况:
user_input = 'Title1 101'
link, title = DATA[user_input]
2楼
只需使用in
来检查全文中是否存在子字符串:
[k for k in mydict if userInput.lower() in mydict[k].lower()]
这将返回所有具有匹配文本的url(当然,可以有多个url)。
3楼
鉴于:
In [41]: d = {
....: 'www.site.sx/file1.html' : 'title1 101 Project Caspian',
....: 'www.site.sx/file2.html' : 'title2 102 Filter Spencer'
....: }
In [43]: d.values()
Out[43]: ['title1 101 Project Caspian', 'title2 102 Filter Spencer']
In [48]: d.keys()
Out[48]: ['www.site.sx/file1.html', 'www.site.sx/file2.html']
您可以创建一个函数
In [45]: def index1(vals, item):
....: for i, v in enumerate(vals):
....: if item in v: return i
....: return -1
这样
In [46]: index1(d.values(), 'temp')
Out[46]: -1
In [47]: index1(d.values(), 'title2')
Out[47]: 1
然后,您可以随时执行以下操作:
In [50]: d.keys()[index1(d.values(), 'title2')]
Out[50]: 'www.site.sx/file2.html'
4楼
我要解释您关于区分大小写的陈述,因为您希望它能起作用,即使用户没有输入正确的大小写也是如此。
在O(log(n))
但具有O(n log n)
预处理步骤的一种可能解决方案是将密钥放入已排序的列表中,并进行二进制搜索以找到正确的密钥,然后是密钥抬头。
您的字典如下所示:
{
'TITLE1 101 Project Caspian' : 'www.site.sx/file1.html',
'TITLE2 102 Filter Spencer' : 'www.site.sx/file2.html',
}
然后,您将获得如下排序列表:
['TITLE1 101 Project Caspian', 'TITLE2 102 Filter Spencer']
作为预处理步骤,您需要将所有内容都变为小写,以处理大小写问题。
当用户输入x
,您将
- 使其小写。
- 对您的列表进行二进制搜索。
- 检查查询是否是二进制搜索返回的元素的前缀。
- 如果是这样,那么您将在字典中进行查找。
5楼
dict1 = {"Vendor": ("Cisco", "Juniper", "HP"), "Model": "2600", "RAM": "128", "IOS": "12.4", "Ports": "4"}
search = raw_input("What are you looking for : ")
looking = (dict1[search])
print looking