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