Python如何不硬编码索引按指定字符串位置分段遍历列表
列表按指定元素分段截取实现方案
需求说明
遍历列表时,从值包含字符串"B"的元素位置开始截取子列表,截取到下一个值包含"B"的元素位置为止,按该规则持续分段直到列表末尾,实现过程不能硬编码索引。
初始代码与预期效果
你已经写出了定位所有"B"位置的列表推导式:
l=["A", "B", "C", "D", "B", "M", "C", "T", "B", "g", "do"] index = [idx for idx, s in enumerate(l) if 'B' in s] print(index)
对于上述多"B"的列表,预期输出分段结果:
l[1:4]=['B', 'C', 'D'] l[4:8]=['B', 'M', 'C', 'T'] l[8:]=['B', 'g', 'do']
如果列表中仅存在一个包含"B"的元素,例如l=["A", "B", "C", "D"],预期输出:
l[1:]=["B", "C", "D"]
实现代码
拿到所有目标元素的索引列表后,只需要相邻索引配对做切片即可,最后一段直接切到列表末尾,完整可运行代码如下:
def split_by_target(input_list, target="B"): # 收集所有目标元素的索引 target_pos = [idx for idx, val in enumerate(input_list) if target in val] segments = [] for i in range(len(target_pos)): start = target_pos[i] # 非最后一个目标点,终点为下一个目标点的索引 if i < len(target_pos) - 1: end = target_pos[i+1] segments.append( (start, end, input_list[start:end]) ) # 最后一个目标点,切到列表末尾 else: segments.append( (start, None, input_list[start:]) ) return segments # 测试多目标场景 l1 = ["A", "B", "C", "D", "B", "M", "C", "T", "B", "g", "do"] for start, end, seg in split_by_target(l1): print(f"l[{start}:{end}]={seg}" if end else f"l[{start}:]={seg}") print("-"*20) # 测试单目标场景 l2 = ["A", "B", "C", "D"] for start, end, seg in split_by_target(l2): print(f"l[{start}:{end}]={seg}" if end else f"l[{start}:]={seg}")
运行结果
执行上述代码会直接输出符合预期的结果:
l[1:4]=['B', 'C', 'D'] l[4:8]=['B', 'M', 'C', 'T'] l[8:]=['B', 'g', 'do'] -------------------- l[1:]=['B', 'C', 'D']
说明:该实现没有硬编码任何索引值,自动适配不同长度、不同目标位置的列表;如果列表中不存在包含"B"的元素,函数会返回空分段列表,不会抛出索引错误,可根据业务需要自行补充边界逻辑。
内容的提问来源于stack exchange,提问作者user7675621
相关产品推荐
相关产品推荐

