代码之家  ›  专栏  ›  技术社区  ›  Dheeraj

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

  •  2
  • Dheeraj  · 技术社区  · 8 年前

    假设我有这样一个列表:

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

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

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

    任何帮助都将不胜感激。

    2 回复  |  直到 8 年前
        1
  •  5
  •   akash karothiya    8 年前

    使用 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)]
    
        2
  •  1
  •   cs95 abhishek58g    8 年前

    高级别的解决方案包括 分组 相邻元素。有多种方法可以做到这一点。我已经用纯python概述了一个 itertools ,还有一个是熊猫,因为这就是你给这个问题加上的标签。

    蟒蛇
    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 ,对 子句 呼叫-

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

    熊猫
    子句 + 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()
    

    我用过 意思是 ,但他们做同样的事情。