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
相关产品推荐
相关产品推荐

