Python-不进行排序而对连续值进行计数
我正在尝试用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
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的编辑。我从来没有说过这是不允许的。我只是说分组,就像之前的评论一样,对我没有帮助。谢谢大家对这个答案的贡献,它完全解决了我的问题,而且它的性能很好。如果可以的话,我会接受你之前所有的答案,因为他们都在解决问题。不过这个解决方案的长度最短,并且只使用了一个导入。感谢您完全回答我的问题。我真的很喜欢你的解决方案。