我有这本词典:
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必须是str,unicode或tuple,而不是list
答案 0 :(得分: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
答案 1 :(得分:1)
你必须再执行一次检查;如果值是list
或不是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]:
,那么任何值是否以该值开头..
{{1}}