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

如何在Python中拆分字符串列表并按指定规则重排为多组列表?

问题描述

给定标准列表:

v1 = ['Elisa', 'Liza', 'Izabela', 'Elisabeth', 'Elizabeth', 'Lisa', 'Lizzy', 'Isabella', 'Isabelle', 'Isabela', 'Liz']
v2 = ['Abbey', 'Abbie', 'Abigail', 'Abby', 'Gail']
v3 = ['Jonathan', 'Jon', 'John', 'Jonny', 'Johnny', 'Nathan']
v4 = ['Alejandra','Alexandra','Alexis','Alya','Alexa','Lexi','Allie','Ally']

输入与规则

输入列表a满足:每个标准列表(v1-v4)恰好包含一个元素,作为对应分组的起始点。需要完成以下操作:

  1. 将a拆分为多个分组,每个分组以某标准列表中的元素开头,后续元素归入该分组直到下一个标准元素出现
  2. 按v1对应组→v2对应组→v3对应组→v4对应组的顺序重排分组,得到a_out1到a_out4

示例1

输入列表:

a = ['Jonathan', 'Jim', 'Jennifer', 'Alya', 'Renee', 'Natasha', 'Phil', 'Lisa', 'Joe', 'Ana', 'Paul', 'Gail', 'Roderick', 'Patricia']

预期输出:

a_out1 = ['Lisa', 'Joe', 'Ana', 'Paul'] 
a_out2 = ['Gail', 'Roderick', 'Patricia']
a_out3 = ['Jonathan', 'Jim', 'Jennifer'] 
a_out4 = ['Alya', 'Renee', 'Natasha', 'Phil']

示例2

输入列表:

a = ['Abby', 'Robin', 'Natasha', 'Frank', 'Ana', 'Jennifer', 'Elizabeth', 'Tanya', 'Jim', 'Will', 'Rob', 'Joe', 'Alexa', 'Roger', 'Adam', 'Paul', 'James', 'Kara', 'John', 'Jeff', 'Rick', 'Steve']

预期输出:

a_out1 = ['Elizabeth', 'Tanya', 'Jim', 'Will', 'Rob', 'Joe']
a_out2 = ['Abby', 'Robin', 'Natasha', 'Frank', 'Ana', 'Jennifer']
a_out3 = ['John', 'Jeff', 'Rick', 'Steve'] 
a_out4 = ['Alexa', 'Roger', 'Adam', 'Paul', 'James', 'Kara']

Python实现方案

核心思路

  1. 建立快速映射:把所有标准元素映射到对应的分组编号(v1→1,v2→2,v3→3,v4→4),实现O(1)时间复杂度的分组判断
  2. 拆分输入列表:遍历a,遇到标准元素则新建分组,后续元素归入当前分组直到下一个标准元素
  3. 按指定顺序排序:根据分组编号对拆分后的分组排序,得到符合要求的输出顺序

完整代码

# 定义标准列表
v1 = ['Elisa', 'Liza', 'Izabela', 'Elisabeth', 'Elizabeth', 'Lisa', 'Lizzy', 'Isabella', 'Isabelle', 'Isabela', 'Liz']
v2 = ['Abbey', 'Abbie', 'Abigail', 'Abby', 'Gail']
v3 = ['Jonathan', 'Jon', 'John', 'Jonny', 'Johnny', 'Nathan']
v4 = ['Alejandra','Alexandra','Alexis','Alya','Alexa','Lexi','Allie','Ally']

# 构建元素到分组编号的映射字典
group_map = {}
for elem in v1:
    group_map[elem] = 1
for elem in v2:
    group_map[elem] = 2
for elem in v3:
    group_map[elem] = 3
for elem in v4:
    group_map[elem] = 4

def split_and_sort(input_list):
    groups = []
    current_group = []
    
    # 遍历输入列表拆分分组
    for elem in input_list:
        if elem in group_map:
            # 遇到标准元素,先保存当前已有的分组(如果存在)
            if current_group:
                groups.append(current_group)
            # 开启新分组
            current_group = [elem]
        else:
            # 非标准元素加入当前分组
            current_group.append(elem)
    # 加入最后一个未保存的分组
    if current_group:
        groups.append(current_group)
    
    # 给分组标记编号并排序
    grouped_with_id = [(group_map[g[0]], g) for g in groups]
    grouped_with_id.sort(key=lambda x: x[0])
    
    # 提取排序后的分组
    a_out1, a_out2, a_out3, a_out4 = [g for _, g in grouped_with_id]
    return a_out1, a_out2, a_out3, a_out4

# 测试示例1
a1 = ['Jonathan', 'Jim', 'Jennifer', 'Alya', 'Renee', 'Natasha', 'Phil', 'Lisa', 'Joe', 'Ana', 'Paul', 'Gail', 'Roderick', 'Patricia']
out1, out2, out3, out4 = split_and_sort(a1)
print(f"a_out1 = {out1}")
print(f"a_out2 = {out2}")
print(f"a_out3 = {out3}")
print(f"a_out4 = {out4}")

# 测试示例2
a2 = ['Abby', 'Robin', 'Natasha', 'Frank', 'Ana', 'Jennifer', 'Elizabeth', 'Tanya', 'Jim', 'Will', 'Rob', 'Joe', 'Alexa', 'Roger', 'Adam', 'Paul', 'James', 'Kara', 'John', 'Jeff', 'Rick', 'Steve']
out1, out2, out3, out4 = split_and_sort(a2)
print(f"\na_out1 = {out1}")
print(f"a_out2 = {out2}")
print(f"a_out3 = {out3}")
print(f"a_out4 = {out4}")

代码说明

  • group_map字典:避免了每次遍历v1-v4查找元素所属分组的低效操作,大幅提升判断速度
  • 分组拆分逻辑:通过识别标准元素作为分组起始点,确保每个分组的边界准确
  • 排序逻辑:利用分组编号进行排序,严格保证输出顺序符合v1→v2→v3→v4的要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:55:21