Python3的map函数中排除空值
Posted
技术标签:
【中文标题】Python3的map函数中排除空值【英文标题】:Exclude null values in map function of Python3 【发布时间】: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
直接返回我想要的结果呢?
【问题讨论】:
【参考方案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
应该避免使用列表推导式。以上是关于Python3的map函数中排除空值的主要内容,如果未能解决你的问题,请参考以下文章