如何用更Pythonic的方式过滤字典列表中不含黑名单字符串的对象?
更Pythonic的实现方式
当然有更贴合Python风格的写法,核心是利用Python的内置函数和列表推导式,把原有的嵌套循环逻辑简化得更简洁直观:
方法一:列表推导式 + any()
这是最推荐的写法,直接将过滤逻辑浓缩为一行,可读性拉满:
movies = [{'original_title': 'Star Wars'}, {'original_title': 'Avengers'}, {'original_title': 'After Love'}] blacklist = ['Star', 'Love'] filtered_movies = [movie for movie in movies if not any(item in movie['original_title'] for item in blacklist)]
逻辑拆解:
any(item in movie['original_title'] for item in blacklist):检查当前电影标题是否包含黑名单中的任意一个关键词,只要有匹配就返回True- 加
not取反后,只有当标题完全不包含黑名单关键词时,才会把该电影加入结果列表
方法二:filter()函数配合lambda(函数式风格)
如果偏好函数式编程的写法,也可以用filter()实现,但可读性略逊于列表推导式:
filtered_movies = list(filter(lambda m: not any(item in m['original_title'] for item in blacklist), movies))
对比原代码的优势:
- 去掉了冗余的临时变量
blacklisted和嵌套循环的模板代码,结构更紧凑 - 用
any()替代手动遍历黑名单,语义更清晰,一眼就能理解是在检查「是否存在任意匹配」 - 完全符合Python「简洁、可读性优先」的设计哲学
内容的提问来源于stack exchange,提问作者XDAF
相关产品推荐
相关产品推荐

