【问题标题】:Syntax error while using Lambda functions使用 Lambda 函数时出现语法错误
【发布时间】:2015-08-22 17:04:50
【问题描述】:

我有一个包含一些虚拟电子邮件地址的列表,如下所示:

listEmails = ['brian-23@email.com', 'britts_54@email.com', 'lara$@email.com']

我试图使用lambdafilter 来获取有效电子邮件地址的列表。 假设lara$@email.com 是唯一无效的电子邮件地址。

我使用正则表达式通过以下代码过滤掉无效电子邮件。

listValid = list(filter(lambda x: x if re.match(r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]{0,3}$",x) ,listEmails))

listEmails)) 之前,我一直在, 收到语法错误。

通常,lambda 函数将逗号 (,) 后面的值作为 输入值,所以我不确定 lambda 函数是否假设 x 来自re.match(r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]{0,3}$",x) 作为输入值。

具有if 条件的 Lambda 函数可以通过以下情况实现:

from functools import reduce
f = lambda a,b: a if (a > b) else b
reduce(f, [47,11,42,102,13])

所以,我想知道为什么它在我的情况下不起作用?

注意:由于 lambda 函数本身出现错误,因此我尚未评估 list(filter( 是否会返回所需的结果。

【问题讨论】:

  • re.match 将是 None 对于不匹配,所以你不需要任何 if

标签: python filter lambda


【解决方案1】:

您在条件表达式中缺少 else 子句:

x if re.match(...) else None

您不能单独使用if;所有的表达式总是产生一个结果,所以如果re.match() 返回None,你需要决定应该返回什么而不是

这里根本不需要条件表达式,直接返回re.match()调用的结果即可:

listValid = list(filter(lambda x: re.match(r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]{0,3}$", x), listEmails))

在 Python 3 中,使用列表推导式而不是 filter() 通常更容易:

listValid = [x for x in listEmails if re.match(r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]{0,3}$", x)]

我会将编译后的正则表达式存储在一个单独的变量中,以使其更具可读性:

email_test = re.compile(r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]{0,3}$")
listValid = [x for x in listEmails if email_test.match(x)]

【讨论】:

  • 我尝试了else pass,但由于这不起作用,我认为else 不是原因。我的错。还是谢谢。
  • 使用值代替pass
  • else: pass 几乎和不写 else: 部分本身一样好。
  • @Vaulstein: pass 不是一个表达式,而是一个语句。您只能在lambda 中使用表达式。 pass 表示什么都不做,而你必须做某事。 None 将是一个合适的返回对象。
【解决方案2】:

您在三元表达式中缺少else 部分。

如你所说:

a if a > b else b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2020-01-12
    相关资源
    最近更新 更多