如何移除生成器中的None值?使用赋值表达式尝试失败
解决生成器过滤None值的问题
你写的代码没结果是因为生成器的执行顺序搞反了——if a的判断逻辑在a:=i.get("x")之前就运行了,这时候a要么是之前的旧值,要么根本没被当前循环的元素赋值,自然过滤掉了所有结果。
正确的做法是把赋值和判断合并到过滤条件里,让程序先赋值再判断:
(a for i in l if (a := i.get("x")) is not None)
这里要注意:如果你的场景里需要保留0、空字符串""这类假值,只过滤None,就必须用is not None做判断;要是你想过滤所有假值(包括0、""、[]等),可以简化成:
(a for i in l if (a := i.get("x")))
举个实际例子验证:
假设l = [{"x": 1}, {"x": None}, {"y": 2}, {"x": ""}, {"x": 0}]
- 第一种写法(仅过滤None)会得到
1, "", 0 - 第二种写法(过滤所有假值)会得到
1
内容的提问来源于stack exchange,提问作者Baz
相关产品推荐
相关产品推荐

