如何以5字符字符串为分隔点将Python列表拆分为子列表?
按特定字符串(长度为5)拆分列表的实现方法
问题背景
给定如下输入列表:
data = '''ABCD1 2040805025@HHS_2332 801111@PPOD_1 225@DDMDM DEFA1 23333@HHS_998 7859000@FGL3 44532009@LLLKH_9 225@DDMDM FGGH5 78271@WQE 8003013@UTTY7'''.split()
如果按固定长度3拆分,可使用列表推导式:
[data[i:i+3] for i in range(0, len(data), 3)]
输出结果为:
[['ABCD1', '2040805025@HHS_2332', '801111@PPOD_1'], ['225@DDMDM', 'DEFA1', '23333@HHS_998'], ['7859000@FGL3', '44532009@LLLKH_9', '225@DDMDM'], ['FGGH5', '78271@WQE', '8003013@UTTY7']]
现在需要实现每次遇到长度为5的字符串(如ABCD1、DEFA1、FGGH5)时拆分列表,且拆分后的子列表不包含这些长度为5的字符串,最终得到如下目标输出:
[ ['2040805025@HHS_2332','801111@PPOD_1','225@DDMDM'], ['23333@HHS_998','7859000@FGL3','44532009@LLLKH_9','225@DDMDM'], ['78271@WQE','8003013@UTTY7'] ]
解决方案
方法1:手动遍历分组
通过遍历列表元素,维护一个临时分组列表,遇到长度为5的字符串时将临时分组存入结果并重置,否则将元素加入临时分组。最后处理剩余的临时分组:
data = '''ABCD1 2040805025@HHS_2332 801111@PPOD_1 225@DDMDM DEFA1 23333@HHS_998 7859000@FGL3 44532009@LLLKH_9 225@DDMDM FGGH5 78271@WQE 8003013@UTTY7'''.split() result = [] current_group = [] for item in data: if len(item) == 5: if current_group: result.append(current_group) current_group = [] else: current_group.append(item) # 处理最后一组未存入的内容 if current_group: result.append(current_group) print(result)
方法2:使用itertools.groupby分组
利用itertools.groupby根据元素是否为长度5的字符串进行分组,过滤掉分隔符对应的组,直接收集目标分组:
from itertools import groupby data = '''ABCD1 2040805025@HHS_2332 801111@PPOD_1 225@DDMDM DEFA1 23333@HHS_998 7859000@FGL3 44532009@LLLKH_9 225@DDMDM FGGH5 78271@WQE 8003013@UTTY7'''.split() # 按元素是否为长度5的字符串分组 result = [list(group) for key, group in groupby(data, lambda x: len(x) == 5) if not key] print(result)
两种方法都能得到符合要求的目标输出,其中方法1逻辑直观易懂,方法2代码更简洁,适合熟悉itertools库的场景。
内容的提问来源于stack exchange,提问作者Rasec Malkic
相关产品推荐
相关产品推荐

