10个Python单行代码,让你的代码更简洁、更快速
内容提要
文章介绍10个实用的Python单行代码技巧,可替代多行写法:用dict.fromkeys去重保序、itertools.chain展平嵌套列表、|合并字典、any短路判断、海象运算符避免重复计算、functools.cache缓存、zip(*matrix)转置矩阵、max取字典最大值键、Counter统计高频项、itertools.batched分块。部分需Python 3.8至3.12以上版本。
延伸解读
版本兼容性提醒
文章中的10个单行代码并非全部兼容旧版Python。其中合并字典(|)需要Python 3.9+,海象运算符需要3.8+,functools.cache需要3.9+,itertools.batched需要3.12+。在旧版本中运行这些代码会引发错误,因此在实际项目中使用前,务必确认运行环境版本,或采用文章提到的替代方案(如用@lru_cache(maxsize=None)代替@functools.cache)。
性能优化背后的原理
这些单行代码不仅简洁,还针对性能做了优化。例如,any()利用短路求值,在找到第一个满足条件的元素后立即停止,比遍历整个集合并设置标志位更高效;functools.cache通过缓存函数返回值,将重复计算的指数级递归变为近似常数时间查找;itertools.chain.from_iterable以惰性方式展平列表,避免了sum(nested, [])的二次时间复杂度。理解这些原理有助于在合适场景中正确选用。
适用场景与注意事项
每个单行代码都有其最佳适用场景。dict.fromkeys去重保序适用于需要保持元素首次出现顺序的场合;zip(*matrix)转置矩阵适合快速重塑表格数据,但要求每行长度一致;Counter.most_common适合统计高频项;itertools.batched适合分批处理API调用或模型输入。需要注意的是,部分代码依赖导入(如itertools、functools、Counter),且转置矩阵时若行长度不等可能导致数据截断。
Q&A
如何用一行Python代码去除列表中的重复元素并保持原来的顺序?
可以使用 list(dict.fromkeys(items))。它利用字典键的唯一性来去重,并且从 Python 3.7 起保证保持元素首次出现的顺序。
Python中如何快速展平一个嵌套列表?
使用 list(itertools.chain.from_iterable(nested))。它惰性地遍历每个子列表,将所有元素收集到一个扁平列表中,比嵌套循环或 sum(nested, []) 更高效。
Python 3.9+ 中如何用一行代码合并两个字典?
使用 merged = defaults | overrides。它会创建一个新字典,包含两个字典的所有键,当键冲突时,右侧字典的值优先。
Python中如何检查集合中是否存在满足条件的元素,并且一旦找到就停止?
使用 any(x < 0 for x in values)。它在任何元素满足条件时立即返回 True,否则返回 False,并且会短路,比设置标志的循环更高效。
Python海象运算符怎么用?能避免重复计算吗?
可以,例如 results = [y for x in data if (y := transform(x)) is not None]。它先对每个元素应用 transform,将结果赋值给 y,然后只保留非 None 的结果,避免调用两次 transform。
如何用一行代码给Python函数添加缓存?
使用 @functools.cache 装饰器(Python 3.9+)。它会存储每个唯一参数组合的返回值,重复调用时直接返回缓存结果,节省计算时间。旧版本可用 @lru_cache(maxsize=None)。
Python中如何不用NumPy转置一个矩阵?
使用 transposed = list(zip(*matrix))。它将每一行解包为 zip 的单独参数,然后 zip 将每行的第一个元素、第二个元素等分别组合,生成列元组。
如何快速找到字典中值最大的键?
使用 best = max(scores, key=scores.get)。它遍历字典的键,返回对应值最大的键。
Python中如何统计列表中出现频率最高的几个元素?
使用 top3 = Counter(words).most_common(3)。它统计每个元素的出现次数,返回出现频率最高的三个 (元素, 计数) 对,按降序排列。
Python 3.12+ 中如何将可迭代对象分割成固定大小的块?
使用 batches = list(itertools.batched(records, 100))。它将可迭代对象分组为最多包含100个元素的元组,最后一个元组包含剩余元素。