根据输入返回不同的输出组合

时间:2018-09-11 13:42:46

标签: python algorithm function

在我的函数中,我有一个列表params_to_opt,其中可以包含以下任意一项:'a''b''c''d',{{ 1}}。

示例:'e'。它可以包含我指定的任意数量(1到5)的条目。它始终至少包含以上条目之一。

根据此输入,我进行各种计算:

params_to_opt=['c', 'e', 'a']

现在我只想返回那些计算出的值。例如,如果def MyFunction(params_to_opt): if 'a' in params_to_opt: out1 = ... if 'b' in params_to_opt: out2= ... if 'c' in params_to_opt: out3 = ... if 'd' in params_to_opt: out4= ... if 'e' in params_to_opt: out5 = ... ,我将返回params_to_opt=['c', 'e', 'a']out1out3

问题是,如果我再次使用if .. else语句,我将不得不考虑31种可能的输出(5 + 10 + 10 + 5 + 1,具体取决于列表的长度)。

有没有一种更优雅的编码方式?我不在乎性能,因为与计算每个out1,out2,out3,out4,out5的时间相比,输出数量很少。

谢谢, 米哈伊尔

3 个答案:

答案 0 :(得分:5)

不需要五个自变量;只需声明一个列表,然后根据需要追加到列表即可。

def MyFunction(params_to_opt):
    results = []
    if 'a' in params_to_opt:
        results.append(...)
    if 'b' in params_to_opt:
        results.append(...)
    if 'c' in params_to_opt:
        results.append(...)
    if 'd' in params_to_opt:
        results.append(...)
    if 'e' in params_to_opt:
        results.append(...)
    return results

答案 1 :(得分:1)

这是另一种解决方案,您可以避免连续使用多个if语句,这在某些时候可能很难维护。

l = ['a', 'b']

l2 = ['a', 'c', 'e']

output = {
    'a': 'out1',
    'b': 'out2',
    'c': 'out3',
    'd': 'out4',
    'e': 'out5',
}


def MyFunction(params_to_opt):
    return [output.get(param) for param in sorted(params_to_opt)]


print(MyFunction(l), end='\n')    # ['out1', 'out2']
print(MyFunction(l2))             # ['out1', 'out3', 'out5']

您可以将所需的内容放在字典中:字符串,函数,条件等

答案 2 :(得分:1)

或者,您也可以使用生成器(和字典):

dictionary = {'a': 'alpha', 'b': 'beta'}

def MyFunction(params_to_opt):
    for param in params_to_opt:
        if param in dictionary:
            yield dictionary[param]

result = [x for x in  MyFunction(['a', 'b'])]

我已经使用了简单的a和b作为输入,但是显然可以进行调整。