避免将函数生成的 None 值添加到推导式中

Gad*_*i A 0 python list-comprehension

我有一个字典(但也可以是列表)形式的理解

my_dict = {bar: foo(bar) for bar in some_range if foo(bar) is not None}
Run Code Online (Sandbox Code Playgroud)

这避免了None向字典插入值,但它也迫使我foo对同一元素调用两次。有没有办法避免这种情况并且foo只调用一次,而不用生成带有值的哈希None并稍后对其进行修剪?

The*_*Guy 6

从 Python 3.8+ 开始,您可以使用:= 命名表达式进行理解,它将避免调用foo(bar)两次:

my_dict = {bar: val for bar in some_range if val:=foo(bar) is not None}
Run Code Online (Sandbox Code Playgroud)

示例运行:

>>> result = {i:j for i in range(10) 
        if (j:=(lambda x: x if x%2==0 else None)(i)) is not None}

#output: 
{0: 0, 2: 2, 4: 4, 6: 6, 8: 8}
Run Code Online (Sandbox Code Playgroud)