
本文介绍一种高效、简洁的方法,将已排序的字符串列表(如 ['c1', 'c1,c2', 'c2,c3', 'c4'])按“单元素字符串”作为自然边界,自动分组为多个连续嵌套子列表,每组以单元素开头并以单元素结尾。
本文介绍一种高效、简洁的方法,将已排序的字符串列表(如 ['c1', 'c1,c2', 'c2,c3', 'c4'])按“单元素字符串”作为自然边界,自动分组为多个连续嵌套子列表,每组以单元素开头并以单元素结尾。
在处理结构化标识符序列(例如带编号的层级标签 C1, C1,C2, C2,C3, C4)时,常需根据语义边界进行逻辑分组。核心观察是:每个独立链路都以一个不包含逗号的“起点”开始,并以另一个不包含逗号的“终点”结束;中间所有元素均为双项组合(含一个逗号),构成连贯路径。
基于该规律,可采用一次遍历、动态构建子列表的策略:
- 初始化一个嵌套列表
result = [[]],用于累积当前组; - 遍历原列表
lst中每个字符串e:- 将
e追加到当前子列表result[-1]; - 若
e不含逗号(即',' not in e),说明它是一个单元素端点;- 此时若当前子列表长度已大于 1(即已包含至少一个前置组合项),则意味着该组已完整闭合 → 新建空子列表
result.append([]),为下一组做准备。
- 此时若当前子列表长度已大于 1(即已包含至少一个前置组合项),则意味着该组已完整闭合 → 新建空子列表
- 将
⚠️ 注意:此方法依赖输入前提——列表必须已按逻辑顺序排列,且每组严格以单元素起始和终止(如
C1→…→C4),同时相邻组之间也由单元素分隔(如C4后紧跟C5)。若不满足,需先预处理或改用图连通性等更鲁棒方案。
以下是完整可运行示例代码:
lst = ['C1', 'C1,C2', 'C2,C3', 'C3,C4', 'C4',
'C5', 'C5,C6', 'C6,C7', 'C7,C8', 'C8',
'C10', 'C10,C11', 'C11,C12', 'C12,C13', 'C13']
result = [[]]
for e in lst:
result[-1].append(e)
if ',' not in e: # 单元素标记:组的边界
if len(result[-1]) > 1: # 避免将孤立单元素误判为组(如无后续组合项)
result.append([])
result.pop() # 移除末尾多余的空列表
print(result)
输出结果为:
[
['C1', 'C1,C2', 'C2,C3', 'C3,C4', 'C4'],
['C5', 'C5,C6', 'C6,C7', 'C7,C8', 'C8'],
['C10', 'C10,C11', 'C11,C12', 'C12,C13', 'C13']
]
该方案时间复杂度为 O(n),空间复杂度为 O(n),简洁可靠,适用于数据质量可控的批量解析场景。










