【问题标题】:list comprehension with multiple conditions (python)具有多个条件的列表理解(python)
【发布时间】:2016-07-15 18:20:01
【问题描述】:

以下代码在 Python 中工作

var=range(20)
var_even = [0 if x%2==0 else x for x in var]
print var,var_even

但是,我认为条件需要放在列表的末尾。如果我制作代码

var_even = [0 if x%2==0 for x in var]

那就不行了。这是有原因的吗?

【问题讨论】:

  • 如果您只想在列表理解中使用if 条件(而不是else),您需要将它放在for 之后,如果您想将它与else 一起使用,您应该放置他们在for之前。
  • 条件表达式必须有一个else。请参阅docs
  • (0 if x%2 == 0 else x)conditional expression。它不是列表理解的一部分。

标签: python list


【解决方案1】:

这里涉及两种截然不同但外观相似的语法,条件表达式列表理解过滤子句

条件表达式的形式为x if y else z。此语法与列表推导无关。如果您想有条件地在列表推导中包含一件事或另一件事,这就是您将使用的:

var_even = [x if x%2==0 else 'odd' for x in var]
#             ^ "if" over here for "this or that"

列表理解过滤子句是elem for x in y if thing 中的if thing。这是列表理解语法的一部分,位于for 子句之后。如果您想有条件地在列表推导中包含或不包含某个元素,您可以使用以下方法:

var_even = [x for x in var if x%2==0]
#                          ^ "if" over here for "this or nothing"

【讨论】:

    【解决方案2】:

    0 if x%2==0 语法为value1 if conditionX else value2,如果conditionX为真,则返回value1,否则返回value2。如果您想从列表中获取事件编号,则不能使用它,如果它是偶数,则始终返回值 0 并且您错过了 else 子句

    你可以这样实现:

    >>> var_even = [x for x in var if x % 2 ==0]
    >>> var_even
    [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    

    或者,您可以使用过滤器:

    >>> even_numbers = filter(lambda x: x % 2 == 0, var)
    >>> list(even_numbers)
    [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 2017-03-20
      • 2013-02-21
      • 1970-01-01
      • 2020-08-27
      • 2012-05-03
      • 2022-11-23
      • 2018-04-29
      • 2019-07-13
      相关资源
      最近更新 更多