使用filter()与lambda表达式过滤元组列表时结果异常求助
问题分析与解决方法
问题根源
filter() 函数的工作逻辑是:对每个传入的元素执行lambda表达式,若表达式返回真值则保留该元素,否则过滤掉。
你当前的lambda表达式返回的是一个列表:[s_a_p[0], s_a_p[1] < 0],而在Python中,任何非空列表都会被判定为True——哪怕列表里包含False值,整个列表本身的布尔值依然是True。这就导致所有元素都被filter()保留下来,完全不符合你“过滤人口小于0的元素”的预期。
解决方法
修改lambda表达式,让它直接返回人口判断的布尔结果,不要包装成列表:
state_and_population = [ ( 'Uttar Pradesh' , 199812341 ), ( 'Maharashtra' , 112372972 ), ( 'Bihar' , 103804637 ), ( 'West Bengal' , 91347736 ), ( 'Madhya Pradesh' , 72597565 ), ( 'Tamil Nadu' , 72138958 ), ( 'Rajasthan' , 68621012 ), ( 'Karnataka' , 61130704 ), ( 'Gujarat' , 60383628 ), ( 'Andhra Pradesh' , 49386799 ) ] # 直接返回布尔判断结果 filtered_object = filter(lambda s_a_p: s_a_p[1] < 0, state_and_population) print(list(filtered_object)) # 输出: []
修改后,lambda对每个元组返回s_a_p[1] < 0的布尔值,由于所有人口数值都是正数,判断结果全为False,因此filter()会过滤掉所有元素,最终输出空列表,符合你的预期。
内容的提问来源于stack exchange,提问作者Ankur Guha
相关产品推荐
相关产品推荐

