【问题标题】:elif using dictionary but without excecute the values [duplicate]elif 使用字典但没有执行值 [重复]
【发布时间】:2018-04-08 04:17:36
【问题描述】:

嗨,假设我想用字典替换一个大的 el-ifs 语句。 一个简化的版本如下:

def functionA(a1, a2, a3):

    results = {
        'case1': a2/a3,
        'case2': 1,
        ...
    }
    return results[a1]

所以 a1 将是一个字符串('case1' 或 'case2' 或 ...)问题是在某些情况下 a3 它可能为 0,因此无法定义结果字典(在所有这些情况下 a1 不会'情况1')。例如:

functionA('case2', 1.0, 3.0)
Out[81]: 1
functionA('case2', 1.0, 0.0)
ZeroDivisionError: integer division or modulo by zero

所以在第二种情况下,我期望为 1,但出现错误。

一个可能的解决方案是:

def functionA(a1, a2, a3):
    results = {
        'case1': str(a2) + '/' + str(a3),
        'case2': str(1),
    }

    return eval(results[a1])

由于我有多个复杂计算的案例,有没有更好的解决方案?

【问题讨论】:

  • 这是默认参数的典型情况。 a3 应该有一个默认值,所以当你只需要 1 个参数时,你不必传递 0。
  • 或者你可以使用 lambda 表达式而不是依赖被评估的字符串表达式。

标签: python dictionary if-statement


【解决方案1】:
def functionA(a1, a2, a3):
    results = {
        'case1': a2 / a3 if a3 != 0.0 else a2,
        'case2': 1,
        # ...
    }
    return results[a1]

但是,我建议不要使用这种方法,因为必须首先计算整个字典才能获取单个值。

相反,如果您真的想使用字典并使其高效,我会建议:

myproc = {
    'case1': lambda a2, a3: a2 / a3 if a3 != 0.0 else a2,
    'case2': lambda a2, a3: 1
}

然后:

>>> myproc['case1'](2, 3)
0.6666666666666666

【讨论】:

    【解决方案2】:

    您可以在字典中使用三元运算符

    def functionA(a1, a2, a3):
    
        results = {
            'case1': a2 if a3==0 else a2/a3,
            'case2': 1
        }
        return results[a1]
    

    链接:https://repl.it/NRkd

    【讨论】:

    • downvoter:如果您认为有任何问题,那么您应该站出来解释。
    • 我认为您的解决方案从根本上没有任何问题 - 所以 +1。
    【解决方案3】:

    如果它只是一个值,您可以使用简单的 if-else 来完成。

    def functionA(a1, a2, a3):
    
         if a3:
            case1_value = a2/a3
         else: 
            case1_value = a2
    
        results = {
            'case1': case1_value,
            'case2': 1,
            ...
        }
        return results[a1]
    

    或者用这个 if-else 条件创建一个 dvision 函数,并在你的 dict 值中使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 2017-09-06
      相关资源
      最近更新 更多