使用Lambda映射过滤后的列表时输出空列表的问题排查
解决Lambda映射过滤二维数组的问题
正确实现代码
假设你的my_list是已经过滤掉负值后的二维数组,要得到每个元素平方后的结果,需要嵌套使用map,因为二维数组的每个元素本身也是一个列表:
# 假设my_list是过滤后的结果:[[1, 2, 6], [3, 4]] final = map(lambda sublist: list(map(lambda x: x**2, sublist)), my_list) print(list(final)) # 输出 [[1, 4, 36], [9, 16]]
如果要把过滤负值+平方一步完成(从原始二维数组直接处理),可以这样写:
original_list = [[-1, 1, 2, -3, 6], [3, -2, 4]] final = map( lambda sublist: list(map(lambda x: x**2, filter(lambda num: num >= 0, sublist))), original_list ) print(list(final)) # 输出 [[1, 4, 36], [9, 16]]
为什么你的final是空列表?
你之前的代码大概率犯了以下错误之一:
- 没有嵌套处理子列表:直接用
map(lambda x: x**2, my_list),此时x是整个子列表(比如[1,2,6]),对列表平方会触发TypeError;如果错误用了filter而非嵌套map,则可能得到空结果。 - 重复迭代生成器:
map和filter返回的都是生成器对象,若my_list本身是生成器,第一次用list(my_list)迭代后已经耗尽了生成器,后续再用它处理final就会返回空。
额外提示
如果觉得嵌套Lambda可读性差,也可以用列表推导式实现,逻辑更清晰:
my_list = [[1, 2, 6], [3, 4]] final = [[x**2 for x in sublist] for sublist in my_list] print(final) # 输出 [[1, 4, 36], [9, 16]]
内容的提问来源于stack exchange,提问作者MDJ19
相关产品推荐
相关产品推荐

