【问题标题】:Exclude null values in map function of Python3Python3的map函数中排除空值
【发布时间】:2018-12-13 20:11:08
【问题描述】:

我在 Python3.6 中使用map 处理列表:

def calc(num):
    if num > 5:
        return None
    return num * 2


r = map(lambda num: clac(num), range(1, 10))
print(list(r))

# => [2, 4, 6, 8, 10, None, None, None, None]

我期望的结果是:[2, 4, 6, 8, 10]

当然,我可以使用filter 来处理map 结果。但是有没有办法让map 直接返回我想要的结果呢?

【问题讨论】:

    标签: python python-3.x map-function


    【解决方案1】:

    在使用 map 本身时不会,但您可以将 map() 调用更改为:

    r = [calc(num) for num in range(1, 10) if calc(num) is not None]
    print(r)  # no need to wrap in list() anymore
    

    得到你想要的结果。

    【讨论】:

    • @spejsy 只有这种特殊情况。在实际情况下,您可能不知道哪个 num 产生了 None 响应。
    • 我要过滤的是calc(num),而不是num。
    • 谢谢,[calc(num) for num in range(1, 10) if calc(num) is not None] 可以工作,但列表中的相同元素将被处理两次。有没有办法优化这个?
    【解决方案2】:

    map 不能直接过滤掉项目。它为每个输入项输出一项。您可以使用列表理解从结果中过滤掉None

    r = [x for x in map(calc, range(1,10)) if x is not None]
    

    (这只对范围内的每个数字调用一次calc。)

    旁白:不用写lambda num: calc(num)。如果您想要一个返回 calc 结果的函数,只需使用 calc 本身即可。

    【讨论】:

    • 谢谢,相对列表理解,过滤器可能是更好的解决方案:r = filter(lambda r: r is not None, map(lambda num: clac(num), range(1, 10)))?
    • @MartinZhu,实际上,列表理解可能会表现得更好。一般来说,filter + lambda / map + lambda 应该避免使用列表推导式。
    猜你喜欢
    • 2019-01-27
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多