2016-02-05 98 views
0

我有一系列形式的條件句:表達式在字典映射

if ':' in particle: 
    do something 
elif 'eq' in particle: 
    do something else 
elif 'lt' in particle: 
    do another thing 
elif 'le' in particle: 
    etc. 
elif 'gt' in particle: 
    etc., etc. 
elif 'ge' in particle: 
    etc., etc., etc. 
elif 'ne' in particle: 
    more etc. 

我想實現這個使用字典映射模式,但我的鑰匙有問題。

我嘗試這樣做:

def case_evaluator(particle): 
    switcher = { 
     ':' in particle: do something, 
     'eq' in particle: do something else, 
     'lt' in particle: do another thing, 
     ... 
    } 
    return switcher.get(particle, "nothing") 

但是,我一直得到 「什麼都沒有。」怎麼能一無所獲?

這似乎應該是簡單的,但很可惜......

+0

不宜「的說法」在某處聲明? – phenxd

+0

對不起......我剛剛編輯過這個。 –

回答

2

你可能想要一個將字符映射到函數的字典。

char_function_dict = { 
    ':': colon_function, 
    'eq': eq_function, 
    'lt': lt_function 
    # ...and so on... 
} 

然後,您可以迭代此字典中的鍵值對。

def apply_function(particle): 
    for char, function in char_function_dict.items(): 
     if char in particle: 
      function() 

但是請注意,這種結構並沒有真正使用任何具體到詞典和不保留的字符進行檢查的順序。使用2元素元組列表可能會更簡單。

char_functions = [ 
    (':', colon_function), 
    ('eq', eq_function), 
    ('lt', lt_function) 
    # ...and so on... 
] 

def apply_function(particle): 
    for char, function in char_functions: 
     if char in particle: 
      function() 
      break # so successive functions are not run 

設置這兩種結構的允許參數和/或關鍵字參數傳遞給函數很簡單:

def apply_function(particle, *args, **kwargs): 
    for char, function in char_functions: 
     if char in particle: 
      function(*args, **kwargs) 
      break 
+0

不錯。我喜歡。我剛剛發現,這或多或少與您的回覆相同: ... –

2

你在正確的軌道上。這被稱爲函數調度。 它需要看起來更像是這樣的:

def case_evaluator(particle): 
    switcher = { 
     ':': do_something, 
     'eq': do_something_else, 
     'lt': do_another_thing, 
     ... 
    } 
    return switcher.get(particle, lambda: "nothing")() 

其中do_something,等是沒有參數的所有功能。 lambda x: "nothing"是一個lambda函數,它總是返回「Nothing」 - 如果在switcher.keys()中找不到particle,則這是默認函數。

+0

對不起,這個。如果你編輯它,我會再次提升它。你的解決方案也可以。 –