Python - 计算数组中重复的seq元素

时间:2016-10-17 17:13:31

标签: python list

如何解决这个问题

Input: 2
Array = [2,1,3,2,2,2,1,2,2]
Result : 3 (Max of count of seq of 2)

我只是简单地使用for循环,它工作正常。但还有其他有效的方法吗?

for i in array:
    if i == input:
        Cnt = Cnt + 1
        if Cnt > Result:
            Result = Cnt;
    else:
      Cnt = 0

3 个答案:

答案 0 :(得分:1)

您可以使用itertools.groupby

from itertools import groupby
max(sum(1 for i in g) for k, g in groupby(array) if k == input)

答案 1 :(得分:1)

你可能会在理解中严重滥用副作用:-):

Input = 2
Array = [2,1,3,2,2,2,1,2,2]
r = []
Result = max([(r.append(1),len(r))[1] if x==Input else (r.clear(),0)[1] for x in Array])

如果Python允许在表达式中进行赋值,则不需要那种严格的行为:

r = 0
Result = max([++r if x==Input else r=0 for x in Array])   # What we want, but NOT valid Python!

请注意,如果您不想查看中间结果,可以使用生成器表达式代替列表推导。对于玩具阵列而言无关紧要,但对于包含数十万个元素的数组,生成器可以节省内存。

答案 2 :(得分:0)

我认为您所描述的内容可以通过run length encoding.

解决

本质上,您采用一系列数字(最常用于字符或简单的无符号字节)并将其压缩为元组列表,其中一个值表示值,另一个表示一行中出现的次数

array = [2,1,3,2,2,2,1,2,2]
runs = []
count = 0

current = array[0] #setup first iteration
for i in array:
    if i == current: #continue sequence
        count += 1
    else:
        runs.append([count, current]) #start new sequence
        current = i
        count = 1
runs.append([count, current]) #complete last iteration

longest_Sequence = max(runs)