2015-02-24 60 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