【问题标题】:Check continuity of integers and return uniques检查整数的连续性并返回唯一值
【发布时间】:2017-12-12 11:46:09
【问题描述】:

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

[1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 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]

对于连续的正负值,它只会返回一个。

这让我有点困惑。任何人都可以帮助或建议我正确的方法。

任何帮助将不胜感激。

【问题讨论】:

  • [tuple(g) for _, g in itertools.groupby(l)]?

标签: python list pandas


【解决方案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)]

【讨论】:

  • 只是说这是被标记的熊猫。此外,groupby 解决方案是我的第一个 :)
  • 当我忙着编译我的表达时,你发表了评论。如果伤害了你的感情真的很抱歉,请建议我下一步该怎么做?
  • @akash,如果我想从每个元组中获取平均值或唯一值。我该怎么做?
  • 我对在这个网站上遇到的持续不断的敌意感到困惑。只要不是抄袭,我不反对用户发布与我相同的答案。
  • @Dheeraj 看看我对 pandas 的回答,真的很简单。
【解决方案2】:

高级解决方案将涉及分组相邻元素。有不止一种方法可以做到这一点。我用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,但他们做同样的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多