根据一个简单的条件将一个数字列表拆分为几个,列表中的领先和滞后



是否有一种简单的方法将下面的列表分成3个列表?我想在序列重新开始时把列表剪掉。所以每个列表都应该以1开头。

l= [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 4]
l1 = [1, 2, 3,4, 5]
l2=[1,2,3,4]
l3=[1,2,3,4]

我最初的想法是查看lead值并在for循环中实现一个条件,当x.lead

NumPy solution

import numpy as np
l = [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 4]
parts = [list(i) for i in np.split(l,np.flatnonzero(np.diff(l)-1)+1)]
print(parts)

输出
[[1, 2, 3, 4, 5], [1, 2, 3, 4], [1, 2, 3, 4]]

解释:我首先使用numpy.diff找到相邻元素之间的差异,然后减去1以便能够使用numpy.flatnonzero找到差异大于1的地方,添加1(注意numpy.diff输出长度是输入长度减去1)以获得用于numpy.split的索引,最终将其转换为list,否则您将以numpy.arrays结束

这个呢:

l = [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 4]
one_indices = [i for i, e in enumerate(l) if e == 1]
slices = []
for count, item in enumerate(one_indices):
if count == len(one_indices) - 1:
slices.append((item, None))
else:
slices.append((item, one_indices[count + 1]))
sequences = [l[x[0] : x[1]] for x in slices]
print(sequences)

:[[1, 2, 3, 4, 5], [1, 2, 3, 4], [1, 2, 3, 4]]

另一种不使用numpy的方法

l= [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 4]
start = 0
newlist = []
for i,v in enumerate(l):
if i!=0 and v==1: 
newlist.append(l[start:i])
start = i
newlist.append(l[start:i+1])
print(newlist)

工作演示:https://rextester.com/RYCV85570

最新更新