##【前言】
大家好,这里是 Charming讲Python编码小技巧 系列专栏。每天分享一个 30-seconds-of-python 仓库中的神级写法,助你告别“屎山”代码,写出让人眼前一亮的 Pythonic 风格!

1. 小技巧内容描述

你在清洗数据时一定见过这种“脏列表”:

  • None
  • False
  • 0
  • 空字符串 ''

这些无效值会干扰统计、筛选、展示。今天这个技巧就是:一行过滤掉列表中的 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 神级技巧!

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐