2015-02-24 64 views
0

我有此词典:字典模式匹配误差

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 must be str, unicode, or tuple, not list

+2

'value'是一个列表,所以你需要遍历太 – 2015-02-24 12:02:05

+0

如果你使用startswith(值),也不会返回true刚刚开始因为两个单词都以B开头。input.startswith(value)的作用是检查'input'是否以'value'开头。所以如果你有'Bandit'作为输入,'Bmyguest'作为值,它返回false。如果输入是'BmyguestBandit',它将返回true,因为现在输入确实是以(value)开始的。 – Philipp 2015-02-24 12:06:28

+0

@ Philipp这是下一个问题(c: – 2015-02-24 12:15:39

回答

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 
+0

'value'并不总是一个列表,例如'say':例如'thankyou789'' – Lachezar 2015-02-24 12:07:46

+0

@Lucho固定将字符串放入列表 – 2015-02-24 12:13:19

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

您的代码是否适用于BrightBack案例? – Tania 2015-02-24 12:59:26