我有一本字典:
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]: