【问题标题】:List comprehension with if statement使用 if 语句列出理解
【发布时间】:2013-03-06 16:16:06
【问题描述】:

我想比较两个可迭代对象并打印出现在两个可迭代对象中的项目。

>>> a = ('q', 'r')
>>> b = ('q')


# Iterate over a. If y not in b, print y.
# I want to see ['r'] printed.
>>> print([ y if y not in b for y in a])
                              ^

但它给了我一个无效的语法错误,其中 ^ 已被放置。 这个lamba函数有什么问题?

【问题讨论】:

  • 以下所有答案都是正确的,但b = ('q') 也不会创建元组。具有一个元素的元组需要显式的,,即b = ('q',)
  • 我已将tuples 更改为iterables

标签: python if-statement list-comprehension


【解决方案1】:

你的顺序错了。 if 应该在 for 之后(除非它在 ​​if-else 三元运算符中)

[y for y in a if y not in b]

但是这会起作用:

[y if y not in b else other_value for y in a]

【讨论】:

  • 谢谢。我看到这篇关于 lambda 函数中的 if else 语句的帖子stackoverflow.com/questions/4406389/…。而且我认为只使用 if 语句(不使用 else)会以相同的顺序工作。
【解决方案2】:

你把if放在最后:

[y for y in a if y not in b]

列表推导的编写顺序与其嵌套的完整指定对应项的顺序相同,基本上上述语句转换为:

outputlist = []
for y in a:
    if y not in b:
        outputlist.append(y)

您的版本尝试这样做:

outputlist = []
if y not in b:
    for y in a:
        outputlist.append(y)

但列表理解必须至少从一个外循环开始。

【讨论】:

    【解决方案3】:

    列表理解公式:

    [<value_when_condition_true> if <condition> else <value_when_condition_false> for value in list_name]
    

    因此你可以这样做:

    [y for y in a if y not in b]
    

    仅用于演示目的: [y if y not in b else False for y in a ]

    【讨论】:

    • 您不能将else 放在列表理解中,至少不能放在您放置的位置。不要混淆列表推导(过滤)和条件表达式(它必须有一个值,使得 else 表达式是强制性的)。
    • 同意。 else 用于列表理解,但如代码所示。
    • 这是一个条件表达式。它可以在任何适用有效表达式的地方使用。它没有特定于列表推导。
    【解决方案4】:

    这不是一个 lambda 函数。这是一个列表理解。

    只需更改顺序:

    [ y for y in a if y not in b]
    

    【讨论】:

      【解决方案5】:

      如果您使用足够大的列表not in b 子句将对a 中的每个项目进行线性搜索。为什么不使用集合? Set 以 iterable 作为参数创建一个新的 set 对象。

      >>> a = ["a", "b", "c", "d", "e"]
      >>> b = ["c", "d", "f", "g"]
      >>> set(a).intersection(set(b))
      {'c', 'd'}
      

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 1970-01-01
        • 2020-05-13
        • 2021-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-15
        相关资源
        最近更新 更多