【问题标题】:Python - Count consecutive values without sortPython - 计算没有排序的连续值
【发布时间】:2018-02-03 11:13:20
【问题描述】:

我正在尝试在 Python 中构建 2 个不同的函数。

剥离连续值:期望的结果:

exampleArrray = [0,0,0,0,1,1,1,1,1,1,2,2,2,1,1,2,1,2,1,1,2,2,2,2,2,2,1,1,1,1,0,0]
strippedArray = [0,1,2,1,2,1,2,1,2,1,0] 

到目前为止我所尝试的:

def stripArray(array):
    lengthArray = len(array)
    for i in range (1,lengthArray):
        print(i)
        print(lengthArray)
        if (i<lengthArray):
            if(array[i-1] == array[i]):

                print("has been delted " + str(array[i]))   
                del(array[i])
                i = i -1
                lengthArray = lengthArray -1     
        print(array)

stripArray([0,0,0,0,1,1,1,1,1,1,2,2,2,1,1,2,1,2,1,1,2,2,2,2,2,2,1,1,1,1,0,0])

输出:[0, 0, 1, 1, 1, 2, 2, 1, 2, 1, 2, 1, 2, 2, 2, 1, 1, 0],我可以再次循环,但我认为有更好的方法吗?

计算连续值并加入

伪: 4x0、6x1、3x2、2x1、1x2、1x1、1x2、2x1、6x2、4x1、2x0

exampleArrray = [0,0,0,0,1,1,1,1,1,1,2,2,2,1,1,2,1,2,1,1,2,2,2,2,2,2,1,1,1,1,0,0]
   countArray = [40,61,32,21,12,11,12,21,62,41,20]

我想我需要 stripArray 吗?

编辑:

countArray[0] = OccurencesAfterAnother*10  + stripArray[0]

已解决:我们有 3 个完美的功能答案!谢谢你们!你的答案再不一样了,我真的很喜欢他们!

编辑: 感谢大家为接受的答案做出贡献!还有未来的观众,对此有不同的解决方案,并非所有人都需要导入,而其他人则使用 numpy 方法。感谢所有贡献者!

【问题讨论】:

    标签: python arrays


    【解决方案1】:

    试试这个

    from itertools import groupby
    
    count_dups = [sum(1 for lis in group) for lis, group in groupby(exampleArrray)]
    strippedArray =[lis  for lis, group in groupby(exampleArrray)]
    countArray= [int(str(v)+str(c)) for v, c in zip(count_dups, strippedArray)]
    

    输出

    [4, 6, 3, 2, 1, 1, 1, 2, 6, 4, 2]

    [0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0]

    【讨论】:

    • 这可能是最流畅的答案!非常聪明的方法!
    • 另外,用户之前评论说itertools.groupby是不允许的!我已提交编辑以包含 countArray。
    • 我从来没有说过这是不允许的。我只是说分组,就像之前的评论对我没有帮助。
    • 感谢大家为这个答案做出贡献,它完全解决了我的问题,它的性能是老板。如果可以的话,我会接受你以前的所有答案,因为他们都在解决问题。这个解决方案仍然具有最短的长度,并且只使用一个导入。
    【解决方案2】:

    这是一种方法:

    from itertools import zip_longest
    import numpy as np
    
    v = [0,0,0,0,1,1,1,1,1,1,2,2,2,1,1,2,1,2,1,1,2,2,2,2,2,2,1,1,1,1,0,0]
    v_arr = np.array(v)
    
    arr_stripped = [i for i, j in zip_longest(v, v[1:]) if i != j]
    # [0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0]
    
    indices = np.hstack((np.array([-1]), np.where(v_arr[:-1] != v_arr[1:])[0], np.array([len(v_arr)-1])))
    values = [indices[i+1]-indices[i] for i in range(0, len(indices)-1)]
    # [4, 6, 3, 2, 1, 1, 1, 2, 6, 4, 2]
    
    result = [int(str(v)+str(c)) for v, c in zip(values, arr_stripped)]
    # [40, 61, 32, 21, 12, 11, 12, 21, 62, 41, 20]
    

    【讨论】:

    • 这个答案最美!它超出了我最大的愿望!谢谢你的完美!
    【解决方案3】:

    您的stripArray 可能如下所示:

    def stripArray(array):
        last = None
        output = []
        for i in array:
            if i != last:
                output.append(i)
                last = i
        return output
    

    我不懂countArray,所以我无能为力。也许您应该提供更多详细信息

    更新:

    def countArray(array):
    last = None
    output = []
    count = 0
    for i in array:
        if last is not None and i != last:
            output.append(10*count+last)
            count = 1
        else:
          count += 1
        last = i
    output.append(10*count+last)
    return output
    

    【讨论】:

    • 非常感谢,这似乎工作得很好! countArray,应该计算有多少相同的值一个接一个出现,比如说 [0,0,1,2,2,2,0] 然后我们有 2 个接一个 0,一个接一个 1,一个接一个 3 个2 和 1 次又是 0,因为我不想失去值 0,1,2,0,所以我将时间乘以 10。2*10+0,1*10+1,3*10 +2,1*10+0, [20, 11, 32, 10] 是新的数组,
    • 给你。它按照您的描述工作(尝试测试示例),但在我看来,需要这样的功能是一个信号,您做错了。
    • 另请注意,这些函数只是概念,例如,如果将空数组传递给它们,它们就会中断。
    • 嘿,谢谢伙计,我用它来检测信号,并获取每个信号的长度和类型。 ;) 非常感谢!
    【解决方案4】:

    你想对值进行分组,所以让我们使用itertools.groupby:

    >>> from itertools import groupby
    >>> example_list = [0,0,0,0,1,1,1,1,1,1,2,2,2,1,1,2,1,2,1,1,2,2,2,2,2,2,1,1,1,1,0,0]
    >>> [v for (v, _) in groupby(example_list)]
    [0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0]
    

    获取第二个列表,假设值始终在 0 到 9 之间:

    >>> [10 * len(list(vs)) + v for (v, vs) in groupby(example_list)]
    [40, 61, 32, 21, 12, 11, 12, 21, 62, 41, 20]
    

    【讨论】:

    • 感谢您完整回答我的问题。我真的很喜欢你的解决方案。
    【解决方案5】:

    以下工作通过将 exampleArray 的每个项目与 strippedArray 的最后添加项目进行比较:

    strippedArray = [exampleArrray[0]]
    for i in exampleArrray:
        if i != strippedArray[-1]:
            strippedArray.append(i)
    

    输出:

    [0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0]
    

    用于计数和加入:

    templist = [exampleArray[0]]
    outlist = []
    for i in exampleArray[1:]:
        if i == templist[0]:
            templist.append(i)
        else:
            outlist.append(str(len(templist))+str(templist[0]))
            templist = [i]
    outlist.append(str(len(templist))+str(templist[0]))
    print(outlist)
    

    输出:

    ['40', '61', '32', '21', '12', '11', '12', '21', '62', '41', '20']
    

    获取整数列表:

    outlist = [int(i) for i in outlist]
    print(outlist)
    

    输出:

    [40, 61, 32, 21, 12, 11, 12, 21, 62, 41, 20]
    

    【讨论】:

      【解决方案6】:

      你可以在不导入任何模块的情况下做这样的事情:

      exampleArrray= [0,0,0,0,1,1,1,1,1,1,2,2,2,1,1,2,1,2,1,1,2,2,2,2,2,2,1,1,1,1,0,0]
      
      def count_join(e):
          indexs = []
          for i, j in enumerate(e):
              try:
                  if e[i] != e[i + 1]:
                      indexs.append(i)
              except IndexError:
                  pass
          print(indexs.insert(0, -1))
      
          final_output = []
          for i in range(0, len(indexs), 1):
              c = indexs[i:i + 2]
      
              if len(c) > 1:
      
                  final_output.append(int(((str(len(e[c[0] + 1:c[1] + 1]))) + str(e[c[0] + 1:c[1] + 1][0]))))
              else:
                  final_output.append(int((str(len(e[c[0] + 1:])) + str(e[c[0] + 1:][0]))))
      
          return final_output
      
      
      
      print(count_join(exampleArrray))
      

      输出:

      [40, 61, 32, 21, 12, 11, 12, 21, 62, 41, 20]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-15
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        • 2014-04-21
        • 2019-03-27
        • 1970-01-01
        • 2021-05-08
        相关资源
        最近更新 更多