【问题标题】:One-line list comprehension: if-else variants单行列表理解:if-else 变体
【发布时间】:2013-06-23 15:43:32
【问题描述】:

更多的是关于 python 列表理解语法。我有一个列表理解,可以生成给定范围的奇数列表:

[x for x in range(1, 10) if x % 2]

这构成了一个过滤器 - 我有一个源列表,其中我删除了偶数 (if x % 2)。我想在这里使用 if-then-else 之类的东西。以下代码失败:

>>> [x for x in range(1, 10) if x % 2 else x * 100]
  File "<stdin>", line 1
    [x for x in range(1, 10) if x % 2 else x * 100]
                                         ^
SyntaxError: invalid syntax

有一个类似if-else的python表达式:

1 if 0 is 0 else 3

如何在列表推导中使用它?

【问题讨论】:

  • 看它的价值,你有一个“列表理解”,而不是一个生成器。最终语法是相同的,只是生成器使用() 而不是[]
  • 我花了一段时间才明白为什么if x % 2 消除偶数(而不是保留它们)——这是因为x 甚至是x % 2 表达式结果为0,其结果为False,而除0 之外的任何int 的结果为True

标签: python list-comprehension ternary-operator conditional-operator


【解决方案1】:

x if y else z 是您为每个元素返回的表达式的语法。因此你需要:

[ x if x%2 else x*100 for x in range(1, 10) ]

混淆是因为您在第一个示例中使用了 过滤器,但在第二个示例中没有。在第二个示例中,您只是使用三元运算符表达式将每个值映射到另一个值。

使用过滤器,您需要:

[ EXP for x in seq if COND ]

没有你需要的过滤器:

[ EXP for x in seq ]

在您的第二个示例中,表达式是一个“复杂”的表达式,恰好涉及if-else

【讨论】:

  • 我有一个问题...[x for x in range(1, 10) if x % 2] 是正确的语法。 [x if x % 2 for x in range(1, 10)] - 这不是,但[x if x%2 else x*100 for x in range(1, 10)] 又是正确的语法。怎么会?
  • @tkoomzaaskz 在第二个示例中,这既不是三元 if-else 运算符(缺少 else),也不是过滤器(因为它位于列表理解的 EXP 部分)
  • @tkoomzaaskz 为了进一步澄清,请注意您可以在末尾添加第二个if[x if x%2 else x*100 for x in range(1, 10) if not x%3] 第一个if 是三元运算符的一部分,第二个if 是一部分列表理解语法。整个x if x%2 else x*100 与简单的2*x“处于同一水平”,它是for 左侧的表达式,此时if not x%3 的过滤已经发生。
  • 你好,单行语句会比在for i in x: 这样的两行然后在for循环中if i == y: 更高效吗?
【解决方案2】:
[x if x % 2 else x * 100 for x in range(1, 10) ]

【讨论】:

    【解决方案3】:

    只是另一种解决方案,希望有人会喜欢它:

    使用:[假,真][表达式]

    >>> map(lambda x: [x*100, x][x % 2 != 0], range(1,10))
    [1, 200, 3, 400, 5, 600, 7, 800, 9]
    >>>
    

    【讨论】:

      【解决方案4】:

      您也可以通过列表理解来做到这一点:

      A=[[x*100, x][x % 2 != 0] for x in range(1,11)]
      print A
      

      【讨论】:

      • 非常好。一个布尔切片。谢谢你给了我一个更容易阅读的解决方案。
      • 您也可以像这样进行双重分配:A,B = [10,11][a==19],[1,14][a==20]
      【解决方案5】:

      我能够做到这一点

      >>> [x if x % 2 != 0 else x * 100 for x in range(1,10)]
          [1, 200, 3, 400, 5, 600, 7, 800, 9]
      >>>
      

      【讨论】:

        【解决方案6】:

        #如何排列一个负值和正值数组的列表

        my_list=[-2,-3,0,1,5]
        squred_values=[]
          
        
        squred_values=[-i**2 if i<0 else i**2 for i in my_list]
        

        #或

        for i in my_list:
            if i<0:
                squred_values.append( -i**2)`enter code here`
            else:
                squred_values.append( i**2) 
        

        【讨论】:

          【解决方案7】:

          二合一列表理解

          ex = [['obi', 'is', '#alive'],['oge', 'is', 'beautiful'],
                          ['Ade', 'the', '#comedian', 'de', '#rich'],['Jesus', 'wept']]
          [print(j) if j.startswith("#") else print("_"+j) for i in ex for j in i]
          

          【讨论】:

          • 为什么要在列表理解中打印?这将创建一个完整的列表 Nones...
          猜你喜欢
          • 2018-04-27
          • 2023-03-14
          • 2021-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-23
          • 2022-01-05
          相关资源
          最近更新 更多