Python 将数组拆分为正数和负数,同时保持列表结构

问题描述 投票:0回答:3

我遇到了这个问题,我必须在保持列表结构的同时拆分负数和正数列表。

零被视为正值

示例:

输入数据

[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
有条件或有条件切片,但也没有运气。

python
3个回答
6
投票

如果没有进一步研究,我会使用标准库中的 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。


2
投票

你可以使用熊猫:

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

0
投票

一个简单的方法是使用:

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)
© www.soinside.com 2019 - 2024. All rights reserved.