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']]