如何将有序字符串列表拆分为以单元素字符串首尾的嵌套子列表
如何将有序字符串列表拆分为以单元素字符串首尾的嵌套子列表
看起来你已经把数据整理得很规范了——列表是有序的,每个元素要么是单个的Cx,要么是两个连续的Cx,Cy,而且正好能组成一个个完整的“链条”,从单个元素开始,经过中间的连接项,再到单个元素结束。你的思路方向是对的,不过可以更聚焦在**“识别每个子列表的起始和结束标记”**上,也就是那些split(',')长度为1的单元素项。
我给你提供一个清晰的实现思路,代码简洁又容易理解:
l = ['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 = [] current_sublist = [] for item in l: current_sublist.append(item) # 当遇到单个元素,且不是子列表的第一个元素时,说明当前链条结束 if len(item.split(',')) == 1 and len(current_sublist) > 1: result.append(current_sublist) current_sublist = [] # 兼容边缘情况:如果列表最后没有以单个元素收尾,把剩余内容加入结果 if current_sublist: result.append(current_sublist) 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'] ]
为什么这个思路可行?
因为你的列表是严格有序的:
- 每个子列表必然以单个元素开头(比如
C1) - 中间跟着一系列连接两个元素的过渡项(比如
C1,C2) - 最后以对应的结束单个元素收尾(比如
C4)
所以我们只需要抓住核心逻辑:
- 不断往当前子列表里追加元素
- 每当遇到不是子列表第一个元素的单元素项,就说明这个链条走完了,把当前子列表存入结果,然后重置当前子列表
- 循环结束后的兜底判断,是为了兼容一些边缘情况(比如列表最后没有以单个元素收尾的场景)
对你原有思路的小点评
你原来的代码里已经想到了拆分元素、判断单个/多个元素,方向完全正确,但有点分散在各种print判断里。我们只需要锚定“单元素是链条的起点和终点”这个核心,逻辑就会清晰很多。
备注:内容来源于stack exchange,提问作者matteo
相关产品推荐
相关产品推荐

