You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将列表拆分为子列表?以氨基酸序列列表为例

简洁拆分以'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',都把当前元素加入临时列表
  • 遍历结束后,把最后一个未存入的临时组加入结果

方案二:巧用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

火山引擎 最新活动