字典模式匹配错误



我有一本字典:

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的第一个参数必须是str、unicode或tuple,而不是列出

如果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

您必须再执行一次检查;如果值是否为CCD_ 12;如果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]: 

最新更新