You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何用生成器/with...as优化重复split的列表推导式?

优化列表推导,避免重复split操作

好问题!重复调用split()确实有点冗余,而且不够优雅。这里有几种更简洁高效的实现方式,帮你只做一次拆分就完成目标:

方法一:解包+切片(最简洁)

利用列表推导的解包特性,先把每个元素里的字符串和数值分开,然后只拆分一次字符串,再通过切片取后两个部分转成元组:

var = [['x_A_B', 1], ['x_A_C', 1], ['x_B_A', 1], ['x_B_D', 1], ['x_C_A', 1], ['x_C_D', 1], ['x_D_B', 1], ['x_D_C', 1]]
var2 = [tuple(s.split("_")[1:]) for s, _ in var]
  • s, _:解包每个子列表,s拿到字符串部分,_用来忽略数值(因为我们不需要它)
  • s.split("_")[1:]:拆分一次字符串后,直接取索引1到末尾的所有元素(正好是你要的A、B/C/D这些)
  • tuple():把切片得到的列表转成你需要的元组格式

方法二:赋值表达式(Python 3.8+)

如果你习惯用Python 3.8引入的赋值表达式(海象运算符),也可以这样写,把拆分结果暂存起来:

var2 = [tuple(parts[1:]) for s, _ in var if (parts := s.split("_"))]

这里parts := s.split("_")会先执行拆分并把结果存在parts变量里,后续直接用parts取需要的部分,同样只做一次拆分。

方法三:用map封装逻辑(更易读)

如果后续可能需要复用这个提取逻辑,把它封装成函数再配合map使用会更清晰:

def get_pair(item):
    str_part, _ = item
    _, first, second = str_part.split("_")  # 直接解包拆分结果,忽略第一个元素'x'
    return (first, second)

var2 = list(map(get_pair, var))

这种方式可读性更强,尤其是当提取逻辑变复杂时,维护起来更方便。

对比你原来的代码,这些方法都只执行一次split()操作,既提升了效率,也让代码更简洁易读。

内容的提问来源于stack exchange,提问作者Rolf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:13:24