首页 > 解决方案 > 从单个列表创建不规则的列表列表

问题描述

我正在尝试从单个列表创建列表列表。如果新列表具有相同数量的元素,我可以做到这一点,但情况并非总是如此

如前所述,当列表列表具有相同数量的元素时,下面的函数起作用。

我尝试使用正则表达式来确定元素是否与模式匹配, pattern2=re.compile(r'\d\d\d\d\d\d')因为我的新列表列表中的第一个值将始终为 6 位,并且它将是唯一遵循该格式的值。但是,我不确定让它在下一场比赛中停止并创建另一个列表的语法

def chunks(l,n):
    for i in range(0,len(l),n):
        yield l[i:i+n]

如果列表列表包含相同数量的元素,则上面的代码有效

以下是我所期望的。

OldList=[111111,a,b,c,d,222222,a,b,c,333333,a,d,e,f]
DesiredList=[[111111,a,b,c,d],[222222,a,b,c],[333333,a,d,e,f]]

非常感谢。

干杯

标签: pythonregexpython-3.xlist

解决方案


可能是一种更有效的方法(循环更少),但这里有一种方法可以找到断点的索引,然后将列表从索引分割None到索引列表的末尾,以捕获剩余的项目。如果你的 6 位数字真的是字符串,那么你可以消除str()里面的re.match().

import re

d = [111111,'a','b','c','d',222222,'a','b','c',333333,'a','d','e','f']      

indexes = [i for i, x in enumerate(d) if re.match(r'\d{6}', str(x))]
groups = [d[s:e] for s, e in zip(indexes, indexes[1:] + [None])]
print(groups)
# [[111111, 'a', 'b', 'c', 'd'], [222222, 'a', 'b', 'c'], [333333, 'a', 'd', 'e', 'f']]

推荐阅读