【2026-03-06】Python神技巧:一行清理列表无效值,数据预处理快狠准!
·
##【前言】
大家好,这里是 Charming讲Python编码小技巧 系列专栏。每天分享一个 30-seconds-of-python 仓库中的神级写法,助你告别“屎山”代码,写出让人眼前一亮的 Pythonic 风格!
1. 小技巧内容描述
你在清洗数据时一定见过这种“脏列表”:
NoneFalse0- 空字符串
''
这些无效值会干扰统计、筛选、展示。今天这个技巧就是:一行过滤掉列表中的 falsy 值。
def compact(lst):
return list(filter(None, lst))
调用示例:
compact([0, 1, False, 2, '', 3, 'a', 's', 34])
# [1, 2, 3, 'a', 's', 34]
一句话:把杂乱输入,快速变成可用数据。
2. 为什么这么用
为什么推荐这写法?
- 极简高效:
filter(None, lst)语义清楚、代码很短。 - 数据清洗高频:预处理阶段几乎天天会用到。
- 可复用性强:日志、接口返回、表单数据都适用。
例子1:清理表单提交结果
raw_form = ['张三', '', None, '北京', False]
print(compact(raw_form))
# ['张三', '北京']
做入库前处理时,先清空值,能减少后续异常。
例子2:处理接口返回列表
api_items = [None, {'id': 1}, {}, False, {'id': 2}]
print(compact(api_items))
# [{'id': 1}, {'id': 2}]
列表中混入空值是常见问题,这一步能快速“净化”数据。
例子3:日志字段预过滤
fields = ['ERROR', '', 'payment', None, 'timeout']
print(compact(fields))
# ['ERROR', 'payment', 'timeout']
做日志关键词分析前,先过滤无效字段,结果更准确。
3. 更多实用场景
- 爬虫抓取结果的空内容清理
- 特征工程前的样本字段预处理
- 导出报表前的空值字段过滤
- 消息队列消费时的无效载荷剔除
4. 和其他常规方案的性能对比情况
常规方案通常是:
- 方案A:手写
for循环 +if item+append - 方案B:列表推导式
[x for x in lst if x]
对比来看:
filter(None, lst)与列表推导式都属于单次遍历,性能思路相近(常见 O(n))filter(None, lst)在“只做过滤”场景语义更聚焦- 手写循环更啰嗦,可读性和复用性都偏弱
5. 进阶技巧
- 若你不想过滤
0,可改成自定义条件(如仅过滤None和空串)。 - 对字符串列表可先
strip()再compact,连空白字符串一起处理。 - 在流水线处理中可与
map()、group_by组合,形成清洗 + 转换一体链路。
6. 总结
compact 是数据清洗中的高性价比技巧:写法短、效果直观、复用价值高。遇到“列表里掺杂无效值”的场景,直接拿来就能用。
点赞 + 收藏,明天继续解锁一个 30-seconds-of-python 神级技巧!
更多推荐


所有评论(0)