如何将列表拆分为子列表?以氨基酸序列列表为例
简洁拆分以'Met'开头的氨基酸子列表
嘿,这个需求我太熟悉了!你之前通过找索引切片的方法确实有点繁琐,其实用简单的循环遍历或者巧用工具库就能轻松搞定,下面给你两种实用方案:
方案一:直观遍历法(无额外依赖)
这种方法逻辑清晰,不需要处理复杂的索引计算,顺着列表逐个处理元素就行:
amino = ['Met','Phe','Pro','Ala','Ser','Met','Ser','Gly','Gly','Met','Thr','Trp'] amino_split = [] current_group = [] for aa in amino: # 遇到'Met'时,先把之前攒好的组存入结果(如果有的话) if aa == 'Met': if current_group: amino_split.append(current_group) current_group = [] # 把当前氨基酸加入当前组 current_group.append(aa) # 别忘了把最后一组也加进去 amino_split.append(current_group) print(amino_split) # 输出:[['Met','Phe','Pro','Ala','Ser'],['Met','Ser','Gly','Gly'],['Met','Thr','Trp']]
思路解释
- 初始化两个空列表:
amino_split存最终结果,current_group临时存放当前正在攒的子列表 - 遍历每个氨基酸:
- 碰到'Met'时,检查
current_group是否有内容——如果有,说明这是上一组的结尾,把它加入结果后重置临时列表 - 不管是不是'Met',都把当前元素加入临时列表
- 碰到'Met'时,检查
- 遍历结束后,把最后一个未存入的临时组加入结果
方案二:巧用itertools.groupby(简洁但稍带技巧)
如果你喜欢用Python的工具库,itertools.groupby可以帮你一行搞定分组逻辑,不过需要借助一个计数器来标记分组:
from itertools import groupby amino = ['Met','Phe','Pro','Ala','Ser','Met','Ser','Gly','Gly','Met','Thr','Trp'] group_counter = 0 # 用lambda生成分组键:每次遇到'Met'就递增计数器 groups = groupby(amino, key=lambda x: group_counter if x != 'Met' else (lambda c: c)(group_counter + 1)) # 把分组转换为列表列表 amino_split = [list(group) for _, group in groups] print(amino_split) # 输出和上面一致
思路解释
- 用
group_counter来标记每个分组,遇到'Met'时计数器加1,这样同一个分组内的元素会有相同的计数器值 groupby会根据这个计数器值把元素分成不同的组,最后把每个组转换成列表即可
两种方法里,第一种更直观易懂,不需要额外导入库,日常维护也更方便;第二种适合追求代码简洁的场景。
内容的提问来源于stack exchange,提问作者heiiRa




