如何在python列表理解中翻译嵌套的if-else

时间:2019-05-05 22:07:27

标签: python list if-statement list-comprehension

我正在尝试将“常规的”嵌套if-else转换为python中的列表理解,但我无法完成。

def functst(a, list_a, b, list_b):
    list_result = []
    for i in range(len(list_a)):
        if a != 0:
            if list_a[i] <= a:
                list_result.insert(i, 1)
            else:
                list_result.insert(i, a/list_a[i] * (1 - list_b[i]))
        elif list_a[i] <= b:
             list_result.insert(i,1)
        else:
            list_result.insert(i, b/list_a[i] * (1-list_b[i]))
    return list_result

我想使用嵌套的if-else将其转换为列表理解。有输入吗?

3 个答案:

答案 0 :(得分:1)

丑陋,但确实可以做到:

list_result = [
  (
    1
    if list_a[i] <= a else
    a/list_a[i] * (1 - list_b[i])
  )
  if a != 0 else
  (
    1
    if list_a[i] <= b else
    b/list_a[i] * (1-list_b[i])
  )
  for i in xrange(len(list_a))
]

我个人反对如此复杂的逻辑;尽管您的解决方案可能不是Python风格的,但更容易理解。

如果您对细节感兴趣,请按照以下步骤操作:

  1. 与外部if进行交易:
list_result = [
  (first condition)
  if a != 0 else
  (second condition)
  (for i in something, or for element in set, or... don't care yet)
]
  1. 构建第一个嵌套的if
list_result = [
  (
    1
    if list_a[i] <= a else
    a/list_a[i] * (1 - list_b[i])
  )
  if a != 0 else
  (second condition)
  (still skipping the iteration part, will return later to it)
]
  1. 以相同的方式构建第二个嵌套的if
  2. 最后,构造迭代。

答案 1 :(得分:1)

不确定为什么要这样做,但是也许

if a:
  return [1 if list_a[i] <= a else (a / list_a[i] * (1 - list_b[i]))
          for i in range(len(list_a))]
else:
  return [1 if list_a[i] <= b else (b / list_a[i] * (1 - list_b[i]))
          for i in range(len(list_a))]

您可以使用return [<first list>] if a else [<second list>]将其变成单线 或可能是带有嵌套的单个理解:

[(... if ... <= a else ...) if a
 else (... if ... <= b else ...)
 for i in range(...)]

但是,为什么呢?

答案 2 :(得分:0)

在每次迭代中,您要评估一个包含2个常量(ab)和两个变量(list_alist_b的内容)的函数。我的建议是将逻辑移到使用这四个参数的辅助函数中。

def helper(a, A, b, B):
    if a != 0:
        if A <= a:
            return 1
        else:
            return a/A*(1-B)
    elif A <=b:
        return 1
    else:
        return b/A*(1-B)

现在,您可以使用helper在列表理解内调用zip

list_result = [helper(a,A_val,b,B_val) for A_val, B_val in zip(list_a, list_b)]

此外,如果要使用原始功能,则应使用append而不是insert。更改之后,您的原始方法就像列表理解一样具有Python风格。