如何根据用户输入在Python字典中搜索部分匹配的元素?

0 投票
5 回答
3276 浏览
提问于 2025-04-17 22:15

我有一个字典,结构大概是这样的:

{
    'www.site.sx/file1.html' : 'TITLE1 101 Project Caspian', 
    'www.site.sx/file2.html' : 'TITLE2 102 Filter Spencer'
}

我希望用户只需要输入 title2 102 就能找到这里的第二个条目,这样程序就可以从相关链接获取资源。请问我该如何使用用户输入的值在字典中进行模糊匹配搜索呢?


举个例子:

用户输入:

title1 101

或者可能输入:

Title1 101

那么,我该如何使用这些输入来在字典中找到匹配的内容呢?


注意: - 字母的大小写是有区别的...

5 个回答

0
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

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

0

给定:

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'
0

我理解你的意思是,你希望程序能够在用户输入时不区分大小写,也就是说用户输入的字母大小写不正确时,程序仍然能正常工作。

一种可能的解决方案是,先把所有的键放到一个排序好的列表里,然后用一种叫做二分查找的方法来找到正确的键。这个方法的查找速度是 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. 如果是的话,就在你的字典里查找对应的值。
0

如果可以的话,你可能需要重新整理一下你的数据,这样会更好:

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]
0

只需要用 in 来检查一个子字符串是否出现在你的完整文本中:

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

这样可以返回所有包含匹配文本的链接(当然,可能会有多个这样的链接)。

撰写回答