Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从单个列表创建不规则列表_Python_Regex_Python 3.x_List - Fatal编程技术网

Python 从单个列表创建不规则列表

Python 从单个列表创建不规则列表,python,regex,python-3.x,list,Python,Regex,Python 3.x,List,我正在尝试从一个列表创建一个列表。如果新列表具有相同数量的元素,我可以这样做,但是情况并非总是如此 如前所述,当列表具有相同数量的元素时,下面的函数起作用 我尝试使用正则表达式来确定元素是否与模式匹配 pattern2=re.compile(r'\d\d\d\d\d')因为我的新列表上的第一个值始终是6位数字,并且它将是唯一遵循该格式的值。但是,我不确定让它在下一次匹配时停止并创建另一个列表的语法 def chunks(l,n): for i in range(0,len(l),n):

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

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

我尝试使用正则表达式来确定元素是否与模式匹配
pattern2=re.compile(r'\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]]
非常感谢


Cheers

可能是一种更有效的方法(使用更少的循环),但这里有一种方法可以找到断点的索引,然后将列表从一个索引切片到另一个索引,并在索引列表的末尾追加
None
,以捕获剩余的项。如果您的6位数字实际上是字符串,那么您可以消除
re.match()
中的
str()

你可以用折页

首先,定义一个函数来定位开始标志:

>>> def is_start_flag(v):
...     return len(v) == 6 and v.isdigit()
如果标志不是您期望的那样,或者排除一些误报,或者即使您需要正则表达式,那么这将非常有用

然后使用
functools.reduce

>>> L = d = ['111111', 'a', 'b', 'c', 'd', '222222', 'a', 'b', 'c', '333333', 'a', 'd', 'e', 'f']
>>> import functools
>>> functools.reduce(lambda acc, x: acc+[[x]] if is_start_flag(x) else acc[:-1]+[acc[-1]+[x]], L, [])
[['111111', 'a', 'b', 'c', 'd'], ['222222', 'a', 'b', 'c'], ['333333', 'a', 'd', 'e', 'f']]
如果下一个元素
x
是开始标志,则向累加器追加一个新列表
[x]
。否则,将元素添加到当前列表中,即累加器的最后一个列表

>>> L = d = ['111111', 'a', 'b', 'c', 'd', '222222', 'a', 'b', 'c', '333333', 'a', 'd', 'e', 'f']
>>> import functools
>>> functools.reduce(lambda acc, x: acc+[[x]] if is_start_flag(x) else acc[:-1]+[acc[-1]+[x]], L, [])
[['111111', 'a', 'b', 'c', 'd'], ['222222', 'a', 'b', 'c'], ['333333', 'a', 'd', 'e', 'f']]