当前位置: 代码迷 >> python >> 如何从仅与字典中部分元素匹配的用户输入中搜索python字典?
  详细解决方案

如何从仅与字典中部分元素匹配的用户输入中搜索python字典?

热度:67   发布时间:2023-07-14 09:51:59.0

我有一本结构如下的字典:

{
    '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-区分大小写很重要...

如果可能,最好重组数据:

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]

只需使用in来检查全文中是否存在子字符串:

[k for k in mydict if userInput.lower() in mydict[k].lower()]

这将返回所有具有匹配文本的url(当然,可以有多个url)。

鉴于:

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'

我要解释您关于区分大小写的陈述,因为您希望它能起作用,即使用户没有输入正确的大小写也是如此。

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 ,您将

  1. 使其小写。
  2. 对您的列表进行二进制搜索。
  3. 检查查询是否是二进制搜索返回的元素的前缀。
  4. 如果是这样,那么您将在字典中进行查找。
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