Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-不进行排序而对连续值进行计数_Python_Arrays - Fatal编程技术网

Python-不进行排序而对连续值进行计数

Python-不进行排序而对连续值进行计数,python,arrays,Python,Arrays,我正在尝试用Python构建两个不同的函数 条带连续值:期望结果: 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,lengt

我正在尝试用Python构建两个不同的函数

条带连续值:期望结果:

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])
我想我需要这条线

编辑:

countArray[0] = OccurencesAfterAnother*10  + stripArray[0]
解决方案:我们有3个完美的功能答案!谢谢大家!!你的答案完全不同,我真的很喜欢

编辑:
感谢大家对接受的答案作出贡献!另外,未来的观众,有不同的解决方案,并不是所有人都需要导入,其他人正在使用numpy方法。感谢所有的贡献者

您的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

您希望对值进行分组,因此让我们使用:

要获取第二个列表,假设值始终在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]

通过将exampleArray的每个项与最后添加的StrippeArray项进行比较,可以执行以下操作:

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]
['40', '61', '32', '21', '12', '11', '12', '21', '62', '41', '20']
[40, 61, 32, 21, 12, 11, 12, 21, 62, 41, 20]
计算和加入:

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)
输出:

[0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0]
['40', '61', '32', '21', '12', '11', '12', '21', '62', '41', '20']
[40, 61, 32, 21, 12, 11, 12, 21, 62, 41, 20]
要获取整数列表,请执行以下操作:

outlist = [int(i) for i in outlist]
print(outlist)
输出:

[0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0]
['40', '61', '32', '21', '12', '11', '12', '21', '62', '41', '20']
[40, 61, 32, 21, 12, 11, 12, 21, 62, 41, 20]
这里有一个方法:

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]
试试这个

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,2,1,0]


您可以在不导入任何模块的情况下执行以下操作:

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]

非常感谢这似乎工作得很好!countArray,应该计算有多少相同的值,比如说[0,0,1,2,2,0],然后我们有一个接一个的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]是新的数组,给你。它的工作原理如您所述,请尝试测试示例,但在我看来,需要这样一个函数是一种迹象,您正在做一些错误的事情。另外请注意,这些函数只是概念,如果向它们传递空数组,它们将断开。嘿,谢谢你,伙计,我使用它进行信号检测,并获取每个信号和类型的长度;非常感谢!这个答案是最美的!这超出了我最大的愿望!谢谢,太好了!这可能是最顺利的答案!非常聪明的方法!另外,用户之前评论说不允许使用itertools.groupby!我已经提交了一个包含countArray的编辑。我从来没有说过这是不允许的。我只是说分组,就像之前的评论一样,对我没有帮助。谢谢大家对这个答案的贡献,它完全解决了我的问题,而且它的性能很好。如果可以的话,我会接受你之前所有的答案,因为他们都在解决问题。不过这个解决方案的长度最短,并且只使用了一个导入。感谢您完全回答我的问题。我真的很喜欢你的解决方案。