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,因为这就是您标记问题的地方
Pythonitertools.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看到我关于熊猫的答案,它真的很简单。