【问题标题】:Dictionary pattern matching error字典模式匹配错误
【发布时间】:2015-02-24 12:00:04
【问题描述】:

我有这本词典:

mydict = {'greet': ['Hello123','hi45'],
          'say': 'thankyou789',
          'slang': ['Bmyguest','Bmyfriend']}

我想根据部分匹配的用户输入获取密钥,例如:

如果用户输入'Brightback',我应该返回'slang',因为只有'slang' 包含以'B' 开头的条目。如果用户输入'Hello''hi',我应该返回'greet'

input="Brightback"
for key, value in mydict.iteritems():
    if input.startswith(value):
        print key

这给出了错误:

TypeError: startswith first arg must be str, unicode, or tuple, not list

【问题讨论】:

  • value 是一个列表,因此您也需要对其进行迭代
  • 如果你使用startswith(value),它不会仅仅因为两个单词都以B开头而返回true。input.startswith(value)的作用是检查input是否以value开头.因此,如果您有 Bandit 作为输入,Bmyguest 作为值,则返回 false。如果输入是BmyguestBandit,它将返回true,因为现在输入确实以(值)开头。
  • @Philipp 那是下一个问题(c:

标签: python regex


【解决方案1】:

如果value 是一个列表,您需要对其进行迭代。

如果它是一个字符串,我将值放在一个列表中,否则我保持原样。

我已将名称更改为 values,因为它不止一个:

input="Brightback"
for key, values in mydict.iteritems():
    values = [values] if type(values) is str else values
    for value in values:
        if input.startswith(value):
            print key
            break

另外,为了节省两次打印同一个键,我跳出value in values 循环尝试下一个键。

我喜欢简化代码,您的循环实际上是搜索与单词开头匹配的任何值。 Python有一个内置函数any

input="Brightback"
for key, values in mydict.iteritems():
    values = [values] if type(values) is str else values
    if any(input.startswith(value) for value in values):
        print key

【讨论】:

  • value'say':'thankyou789' 的情况下并不总是一个列表。
  • @Lucho 固定将字符串放入列表
【解决方案2】:

您必须再实施一项检查;值是否为list; if list 那么如果任何值都以该值开头..

In [1]: mydict={'greet':['Hello123','hi45'],'say':'thankyou789','slang':['Bmyguest','Bmyfriend']}

In [2]: myinput="Brightback"

In [3]: for key, value in mydict.iteritems():
   ...:     if isinstance(value, list):
   ...:         if any(x.startswith(myinput) for x in value):
   ...:             print key
   ...:     elif value.startswith(myinput):
   ...:         print key
   ...:         

In [4]: myinput="hi"

In [5]: for key, value in mydict.iteritems():
   ...:     if isinstance(value, list):
   ...:         if any(x.startswith(myinput) for x in value):
   ...:             print key
   ...:     elif value.startswith(myinput):
   ...:         print key
   ...:         
greet

In [6]: myinput="thank"

In [7]: for key, value in mydict.iteritems():
   ...:     if isinstance(value, list):
   ...:         if any(x.startswith(myinput) for x in value):
   ...:             print key
   ...:     elif value.startswith(myinput):
   ...:         print key
   ...:         
say

In [8]: 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2012-04-20
    • 2015-01-12
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多