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

Python 检查整数的连续性并返回唯一性,python,list,pandas,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, -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]
对于连续的正值和负值,它将只返回一个

这让我有点困惑。有谁能帮我或建议我做这件事的正确方法吗


任何帮助都将不胜感激。

请使用
itertools
中的
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]

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

高级解决方案将涉及对相邻元素进行分组。有多种方法可以做到这一点。我使用
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
要查找唯一值,可以使用
mean
unique
-

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

我使用了
的意思,但它们做的是相同的事情。

[itertools.groupby(l)中的g的元组(g)]
?只是说这是标记的熊猫。另外,
groupby
解决方案首先是我的:)当我忙于编译表达式时,你发表了评论。如果我伤害了你的感情,我真的很抱歉,请建议我下一步该怎么做?@akash,如果我想从每个元组中取平均值或唯一值。我怎么能做到这一点呢?我被我在这个网站上不断遭遇的敌意所迷惑。我不反对用户发布与我相同的答案,只要它不是剽窃的。@Dheeraj看到我关于熊猫的答案,它真的很简单。