page contents

python面试题:怎么使用filter求列表中奇数并构造新列表?

平时写 Python,我们经常得对列表做点儿处理。比如说吧,有个列表 a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],你要从里面挑出所有奇数,重新构成一个新列表。

attachments-2025-05-KaniclHZ682e7cb4d2416.jpg平时写 Python,我们经常得对列表做点儿处理。比如说吧,有个列表 a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],你要从里面挑出所有奇数,重新构成一个新列表。

这时候你可能想到了最原始的方法:for 循环一顿 if 判断。但咱是搞 Python 的,对吧,得优雅点,那当然要上 filter。

filter 是干嘛的?

一句话,filter 就是过滤器。你给它一个函数,它就会把这个函数挨个作用在列表的每个元素上。函数返回 True 的,留下;返回 False 的,丢掉。

说白了,它帮你筛选数据,而且不费劲。

来,先看个代码

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

result = list(filter(lambda x: x % 2 == 1, a))

print(result)

输出就是:

[1, 3, 5, 7, 9]

干净利落,代码一行就搞定。是不是比写一堆 if 语句省心多了?

那 lambda 是个啥?

很多刚入门的同学一看到 lambda 就头大,其实它就是个匿名函数。 你可以把这段代码理解成这样写也可以:

def is_odd(x):

    return x % 2 == 1


result = list(filter(is_odd, a))

是不是一下子亲切多了?lambda x: x % 2 == 1 就是把 is_odd 这个函数写成了一行,适合这种只用一次的小场景。

和 for 循环比有啥优势?

你可能说,我写个 for 循环也不麻烦啊,比如:

result = []

for i in a:

    if i % 2 == 1:

        result.append(i)

是的,这当然能用,逻辑也清楚。但问题是,等你遇到更复杂的逻辑、或者你要链式处理好几个操作时,这种写法就太啰嗦了。

用 filter 能让你更接近“声明式编程”,说白了就是:你告诉 Python “我要什么”,而不是“我怎么拿到它”。

filter 的返回值其实不是列表

这个很关键。很多人第一次用会懵,为什么 filter 出来的不是列表?

type(filter(lambda x: x % 2 == 1, a))

结果是 <class 'filter'>。这其实是个迭代器,你要想看结果,得转成 list。

list(filter(lambda x: x % 2 == 1, a))

这也好,节省内存,尤其是数据量大的时候,不会一次性生成所有值,而是用的时候再一个个吐出来。

那有没有什么坑?

一个小坑就是:这个迭代器只能用一次。你一旦转成 list 或 for 循环遍历了,再用它就没了。

所以你要用多次,记得先存一下结果,不然你会发现怎么第二次就啥也没有了。

用 filter 做链式处理更舒服

比如说,你现在想挑出所有奇数,然后再把它们都变成字符串。

传统写法是:

result = []

for i in a:

    if i % 2 == 1:

        result.append(str(i))

但如果用 filter 和 map 一起用,简直丝滑:

result = list(map(str, filter(lambda x: x % 2 == 1, a)))

这句一眼看上去是不是有点“高级感”?别怕,其实就是两个步骤套了一下。

再来点实际场景吧

有一次我在处理一个订单系统的日志,里面一堆 ID 和金额。我得把金额是奇数的订单挑出来,结果人家需求还要返回 ID 列表。

传统方法写了半天,代码又臭又长。后来我用 filter 搭配 lambda,分分钟搞定。

orders = [

    {'id': 'A123', 'amount': 101},

    {'id': 'B456', 'amount': 200},

    {'id': 'C789', 'amount': 303}

]


odd_orders = list(filter(lambda x: x['amount'] % 2 == 1, orders))

odd_ids = list(map(lambda x: x['id'], odd_orders))

print(odd_ids)

结果就是:

['A123', 'C789']

老板看到代码都笑了,说“你这也太简洁了”。我心里想,这不就一顿骚操作吗~

如果用列表推导式会更好吗?

这得看场景。其实同样的奇数筛选,也可以这么写:

result = [x for x in a if x % 2 == 1]

这也很清晰,而且比 filter + lambda 可读性更好。

那为什么还要学 filter?因为有些时候你传的是现成函数,或者你要链式处理多个操作时,filter 就显得更灵活了。

最后总结一句

其实 filter 没什么神秘的,它就是个更优雅的 for 循环。 你要是还没习惯,建议你从简单的场景开始用起来。 等你熟了之后,它会帮你省下不少代码,而且代码也更好维护。

所以,下次你再看到像 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 这样的列表,别再一顿 if 加 append 了, 直接上:

list(filter(lambda x: x % 2 == 1, a))

舒服得很,老板看了都想升你职。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-05-22 09:24
  • 阅读 ( 61 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

2172 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2172 文章
  3. Pack 1335 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章