如何在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)恰好包含一个元素,作为对应分组的起始点。需要完成以下操作:
- 将
a拆分为多个分组,每个分组以某标准列表中的元素开头,后续元素归入该分组直到下一个标准元素出现 - 按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实现方案
核心思路
- 建立快速映射:把所有标准元素映射到对应的分组编号(v1→1,v2→2,v3→3,v4→4),实现O(1)时间复杂度的分组判断
- 拆分输入列表:遍历
a,遇到标准元素则新建分组,后续元素归入当前分组直到下一个标准元素 - 按指定顺序排序:根据分组编号对拆分后的分组排序,得到符合要求的输出顺序
完整代码
# 定义标准列表 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
相关产品推荐
相关产品推荐

