Python中是否有内置的lambda函数用于判断是否为非空?

3

我看到在Python中有很多次重复使用以下的习语:

X = filter(lambda x: x is not None, X))

我希望在Python中有一个内置函数可以处理is not None(或者类似于Java的apache-commons的标准库)。

在我的代码中,我已经将其组织为

def isNotNone(X: Any) -> bool:
    return True if X is not None else False

X = filter(isNotNone, X)

filter(None,X) 做的几乎一样。它过滤掉 None,但也会过滤掉 0 和空字符串,以及“falsy”对象... - Jean-François Fabre
4
return True if X is not None else False 翻译为 return X is not None(更符合Python风格!) - Jean-François Fabre
4
我会使用 X = (elt for elt in X if elt is not None),这样更好 :) - TwistedSim
好的观点。使用带有lambda的“filter”或“map”是缓慢和复杂的。但OP正在寻找一个内置函数。“bool”是最接近的东西(但会过滤掉其他元素)。 - Jean-François Fabre
1个回答

4
你可以使用None.__ne__,也就是None的不等于检查:
>>> lst = [0, [], None, ""]
>>> list(filter(None.__ne__, lst))
[0, [], '']

从技术上讲,这不是测试“x is not None”,而是测试“x != None”,对于某些情况,比如与“None”相等的类,可能会产生不同的结果,但对于大多数实际情况,它应该可以工作。
正如评论中所述,这并不在所有版本的Python中都表现相同,有些正确返回True或False,而其他版本则对大多数值产生NotImplemented,这巧合地“有效”,但不能依赖。相反,最好的方法可能是定义您自己的def或lambda,或者(对于此用例)使用列表推导式。

有趣的是 None.__ne__ 对于大多数非 None 对象并不返回 True,而是返回 NotImplemented。幸运的是,这个值可以被视为真。 - Alex Hall
在我的电脑上,Python 3.6.3中的list(map(None.__ne__, [0, [], None, ""])) == [NotImplemented, NotImplemented, False, NotImplemented] - Alex Hall
@AlexHall 在我的电脑上使用有点过时的 Python 3.4.2 运行结果为 [True, True, False, True](在 2.7.9 上,None.__ne__ 似乎不存在...)。 - tobias_k
这是一个不好的想法,因为它非常微妙地依赖于NotImplemented的行为(在编写时甚至没有意识到),并且因为它鼓励使用None.__eq__来测试事物是否为None,而这根本不起作用 - user2357112
不幸的是,这种方法并不被推荐,在新版本的Python中会发出警告。你应该使用列表推导式代替。 - dqd
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接