2016-02-05 64 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

对不起,这个。如果你编辑它,我会再次提升它。你的解决方案也可以。 –