我遇到了这个问题,我必须在保持列表结构的同时拆分负数和正数列表。
零被视为正值
示例:
输入数据
[1, 1, 1, -2, -2, -2, 1, 1, 1, -2, -2, -2, 1, 1, 1]
输出数据
[[1, 1, 1], [-2, -2, -2], [1, 1, 1], [-2, -2, -2], [1, 1, 1]]
有人可以给我一个好的方向,这将是解决这个问题的好方法吗?
我已经研究过
np.split
有条件或有条件切片,但也没有运气。
如果没有进一步研究,我会使用标准库中的 itertools.groupby。也许有更好的解决方案。
import itertools
vals = [1, 1, 1, -2, -2, -2, 1, 1, 1, -2, -2, -2, 1, 1, 1]
splitted = [list(g) for i, g in itertools.groupby(vals,lambda x: x<0)]
如评论中所述,您必须选择如何处理 0 并相应地调整 lambda。
你可以使用熊猫:
import pandas as pd
l = [1, 1, 1, -2, -2, -2, 1, 1, 1, -2, -2, -2, 1, 1, 1]
s = pd.Series(l)
s.groupby(s.diff().ne(0).cumsum()).agg(list).tolist()
输出:
[[1, 1, 1], [-2, -2, -2], [1, 1, 1], [-2, -2, -2], [1, 1, 1]]
使用 numpy 的另一种解决方案:
np.split(l, np.diff(l).nonzero()[0]+1)
输出:
[array([1, 1, 1]),
array([-2, -2, -2]),
array([1, 1, 1]),
array([-2, -2, -2]),
array([1, 1, 1])]
一个简单的方法是使用:
lst = [1, 1, 1, -2, -2, -2, 1, 1, 1, -2, -2, -2, 1, 1, 1, -2,-2,-2]
L = []
pos = []
neg = []
for m in lst:
if m >= 0:
pos.append(m)
if(len(neg) > 0):
L.append(neg)
neg = []
else:
neg.append(m)
if(len(pos) > 0):
L.append(pos)
pos = []
if len(pos) > 0:
L.append(pos)
elif len(neg) > 0:
L.append(neg)
print(L)