【问题标题】:How to translate nested if-else in python list comprehension如何在 python 列表理解中翻译嵌套的 if-else
【发布时间】:2019-05-05 22:07:27
【问题描述】:

我正在尝试将“常规”嵌套 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 将其转换为列表理解。有输入吗?

【问题讨论】:

  • 示例输入输出对验证更有帮助
  • 同样,您能否更清楚地了解functst() 究竟应该做什么?在从头开始编写代码时,甚至可能有一种更简洁的方法
  • 加上把整个代码写成列表理解是个坏主意
  • 别这样……

标签: python list if-statement list-comprehension


【解决方案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))
]

就我个人而言,我反对这种复杂的逻辑;尽管您的解决方案可能看起来不是 Pythonic,但它更容易理解。

如果您对细节感兴趣,这些是我的步骤:

  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. 最后,构造迭代。

【讨论】:

    【解决方案2】:

    不知道你为什么要这样做,但也许

    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 [&lt;first list&gt;] if a else [&lt;second list&gt;] 将其设为单线 或者可能是带有嵌套的单一理解:

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

    但实际上,为什么要这样做?

    【讨论】:

      【解决方案3】:

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

      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)
      

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

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

      另外,如果您要使用原始函数,则应使用append 而不是insert。更改后,您的原始方法与列表推导式一样具有 Python 风格。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-26
        • 2018-03-18
        • 2020-10-13
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2018-09-08
        • 2022-01-13
        相关资源
        最近更新 更多