Python 3无内置diff函数:数值差分用np.diff(axis=0),文本比对用difflib;二者语义不同,不可混用。

Python 3里没有内置的 diff 函数
很多人搜“Python diff函数”,是受MATLAB或R影响,误以为Python标准库自带类似 diff() 的行间差分工具。实际在纯Python(不含NumPy)中,diff 不存在;而NumPy虽有 np.diff(),但它默认按轴计算相邻元素差,不是“按行比较文本差异”——这是两个完全不同的需求。
你需要先明确:是要做数值序列的逐项差分(如 [1,3,6] → [2,3]),还是对多行字符串做类似 diff 命令的文本比对?下面分场景说明。
数值数组行间差分:用 np.diff() 并指定 axis=0
若你有一组数值数据(比如CSV读入的二维数组),想计算“第2行减第1行、第3行减第2行……”,即纵向差分,np.diff() 是最直接的选择,但必须显式指定 axis=0,否则默认按行内(axis=1)计算。
-
np.diff(arr, axis=0)输出比原数组少一行,形状为(n-1, m) - 若原始数组是
float类型,结果保持精度;若是int,差值仍为int,不自动转float - 注意:它不做“绝对差”或“符号判断”,就是简单减法,负值保留
import numpy as np
arr = np.array([[1, 4, 7],
[2, 6, 8],
[5, 5, 9]])
print(np.diff(arr, axis=0))
# 输出:
# [[ 1 2 1]
# [ 3 -1 1]]
文本行间差异比对:用 difflib.Differ 或 unified_diff
如果你手头是两段文本(比如日志、配置文件、代码片段),想生成类似Linux diff 命令那样的“+/-”格式差异输出,Python标准库的 difflib 模块才是正解。别试图用 np.diff 处理字符串列表——它会报 TypeError: unsupported operand type(s) for -: 'str' and 'str'。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
difflib.Differ().compare(a_lines, b_lines)返回生成器,每行带前缀:' '(相同)、'+'(b独有)、'-'(a独有) -
difflib.unified_diff(a_lines, b_lines)输出标准的unified diff格式(含行号、@@标记),适合存档或CI对比 - 输入必须是**以换行符结尾的字符串列表**,即每行末尾带
'\n',否则比对可能错位
import difflib
a = ['foo\n', 'bar\n', 'baz\n']
b = ['foo\n', 'qux\n', 'baz\n']
for line in difflib.unified_diff(a, b):
print(line, end='') # 注意end='',因line已含\n
常见踩坑:混淆 np.diff 和 shell diff 的语义
最典型的错误,是把数值差分和文本比对混为一谈,然后硬套函数导致报错或结果无意义。比如:
- 对字符串列表调用
np.diff()→ 直接TypeError - 用
difflib处理未加'\n'的字符串(如['a','b'])→ 差分逻辑失效,所有行都被视为“不同” - 忽略
np.diff的axis参数,默认axis=1导致横向差分,而非预期的行间纵向差分 - 用
pd.DataFrame.diff()时没设axis=0(虽然DataFrame默认是纵向,但显式写出更安全)
差分这件事本身很简单,难的是第一时间分清:你在处理数字,还是在比对文本。选错工具链,后面全是徒劳调试。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










