【问题标题】:How can I search a python dictionary from a user's input that will only match part of the element in my dictionary?如何从用户输入中搜索仅匹配字典中部分元素的 python 字典?
【发布时间】:2014-03-14 05:52:18
【问题描述】:

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

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

我希望用户只需键入title2 102 以匹配此处的第二个条目,以便程序可以从关联的链接获取资源。如何使用用户输入的值通过通配符匹配搜索我的字典?


例子:

用户输入

title1 101

或许

Title1 101

现在,我如何使用这个/解析这个来在字典中找到匹配项?


n.b. - 区分大小写很重要...

【问题讨论】:

  • stackoverflow.com/questions/13605017/… 的可能重复项。另外,您是在尝试匹配键还是值?
  • @merlin2011,查看我的编辑。
  • 第二个参考示例应该是Title1 101吗?
  • @user3404787,您的字典示例似乎使用户的输入与值匹配,而不是与字典的键匹配。
  • 如果区分大小写很重要,这是否意味着如果用户输入的内容大小写错误,您不想返回任何结果?

标签: python dictionary


【解决方案1】:

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

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

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

【讨论】:

  • 如果搜索将是 O(n),那么使用字典就没有意义了。
  • @JayanthKoushik 如果需要文本比较,无论如何都会这样。
  • 是的,你是对的。最初的问题是关于搜索键。
【解决方案2】:

给定:

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'

【讨论】:

    【解决方案3】:

    我正在解释您关于区分大小写的声明,因为您希望它能够工作,即使用户没有输入正确的大小写。

    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. 如果是,那么您将在字典中进行查找。

    【讨论】:

      【解决方案4】:

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

      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]
      

      【讨论】:

        【解决方案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
        

        【讨论】:

        • 请给你的答案添加一些解释!
        猜你喜欢
        • 2013-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-02
        • 1970-01-01
        • 2014-08-01
        相关资源
        最近更新 更多