Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字典模式匹配错误_Python_Regex - Fatal编程技术网

Python 字典模式匹配错误

Python 字典模式匹配错误,python,regex,Python,Regex,我有这本字典: mydict = {'greet': ['Hello123','hi45'], 'say': 'thankyou789', 'slang': ['Bmyguest','Bmyfriend']} 我想根据部分匹配的用户输入获取密钥,例如: 如果用户输入'Brightback',我应该返回'slang',因为只有'slang'包含以'B'开头的条目。如果用户输入'Hello'或'hi',我应该返回'greet' input="Brightba

我有这本字典:

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:带有第一个arg的startswith必须是str、unicode或tuple,而不是list


如果
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
另外,为了避免打印同一个键两次,我中断了values循环中的
值,尝试下一个键

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


你必须再执行一次检查;值是否为
列表
;如果
列表
,则如果任何值以该值开头或不以该值开头

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

value
是一个列表,因此您需要对其进行迭代,如果使用startswith(value),则不会因为两个词都以B开头而返回true。input.startswith(value)的作用是检查
input
是否以
value
开头。因此,如果将
Bandit
作为输入,将
Bmyguest
作为值,则返回false。如果输入是
BmyguestBandit
,则返回true,因为现在输入确实是以(value)开始的。@Philipp这是下一个问题(例如,
'say':'thankyou789'
的情况下,value
并不总是一个列表。@Lucho修复了将字符串放入列表的问题
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]: