检查整数的连续性并返回唯一的

时间:2017-12-12 11:46:10

标签: python list pandas

假设我有一个这样的列表:

[1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 0.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0]

我想检查1和-1的连续性。

预期产出:

[(1.0, 1.0), (-1.0, -1.0, -1.0, -1.0, -1.0), (1.0), (-1.0, -1.0, -1.0, -1.0, -1.0),....,(1.0), (0,0), (1.0, 1.0),( -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0)]

[1,-1,1,-1,....,1,0,1,-1]

对于连续的正值和负值,它只返回1。

对我来说有点困惑。任何人都可以帮助或建议我采用正确的方法。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:5)

使用groupby此处的itertools

>>> x = [1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 0.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0]

>>> from itertools import groupby
>>> print([tuple(j) for i, j in groupby(x)])

[(1.0, 1.0), (-1.0, -1.0, -1.0, -1.0, -1.0), (1.0,), (-1.0, -1.0, -1.0, -1.0, -1.0), (1.0,), (-1.0, -1.0), (1.0,), (-1.0, -1.0), (1.0,), (-1.0, -1.0, -1.0), (1.0, 1.0, 1.0), (-1.0, -1.0), (1.0,), (-1.0,), (1.0,), (-1.0,), (1.0, 1.0, 1.0, 1.0), (-1.0, -1.0), (1.0, 1.0, 1.0, 1.0, 1.0), (-1.0, -1.0, -1.0, -1.0), (1.0,), (-1.0,), (1.0,), (-1.0,), (1.0,), (-1.0,), (0.0,), (1.0, 1.0), (-1.0,), (1.0,), (-1.0, -1.0, -1.0, -1.0, -1.0, -1.0)]

答案 1 :(得分:1)

高级解决方案涉及分组相邻元素。有多种方法可以做到这一点。我使用itertools概述了一个纯python,另一个用pandas概述了,因为那是你用问号标记的。

<强>的Python
itertools.groupby

from itertools import groupby

r = [tuple(g) for _, g in groupby(lst)]
r
[(1.0, 1.0), (-1.0, -1.0, -1.0, -1.0, -1.0), (1.0,), (-1.0, -1.0, -1.0, -1.0, -1.0), (1.0,), (-1.0, -1.0), (1.0,), (-1.0, -1.0), (1.0,), (-1.0, -1.0, -1.0), (1.0, 1.0, 1.0), (-1.0, -1.0), (1.0,), (-1.0,), (1.0,), (-1.0,), (1.0, 1.0, 1.0, 1.0), (-1.0, -1.0), (1.0, 1.0, 1.0, 1.0, 1.0), (-1.0, -1.0, -1.0, -1.0), (1.0,), (-1.0,), (1.0,), (-1.0,), (1.0,), (-1.0,), (0.0,), (1.0, 1.0), (-1.0,), (1.0,), (-1.0, -1.0, -1.0, -1.0, -1.0, -1.0)]

如果您想要groupby中的唯一值,请稍微更改为groupby来电 -

r = [i for i, _ in groupby(lst)]

<强>熊猫
groupby + shift + cumsum + apply

x = pd.Series(lst)
r = x.groupby(x.ne(x.shift()).cumsum()).apply(tuple)    
r

1                               (1.0, 1.0)
2           (-1.0, -1.0, -1.0, -1.0, -1.0)
3                                   (1.0,)
4           (-1.0, -1.0, -1.0, -1.0, -1.0)
5                                   (1.0,)
6                             (-1.0, -1.0)
7                                   (1.0,)
8                             (-1.0, -1.0)
9                                   (1.0,)
10                      (-1.0, -1.0, -1.0)
11                         (1.0, 1.0, 1.0)
12                            (-1.0, -1.0)
13                                  (1.0,)
14                                 (-1.0,)
15                                  (1.0,)
16                                 (-1.0,)
17                    (1.0, 1.0, 1.0, 1.0)
18                            (-1.0, -1.0)
19               (1.0, 1.0, 1.0, 1.0, 1.0)
20                (-1.0, -1.0, -1.0, -1.0)
21                                  (1.0,)
22                                 (-1.0,)
23                                  (1.0,)
24                                 (-1.0,)
25                                  (1.0,)
26                                 (-1.0,)
27                                  (0.0,)
28                              (1.0, 1.0)
29                                 (-1.0,)
30                                  (1.0,)
31    (-1.0, -1.0, -1.0, -1.0, -1.0, -1.0)
dtype: object

要查找唯一值,您可以使用meanunique。 -

r = x.groupby(x.ne(x.shift()).cumsum()).mean()

我使用了mean,但是他们做了同样的事情。

相关问题