Home > Software design >  function that returns the length of the longest run of repetition in a given list
function that returns the length of the longest run of repetition in a given list

Time:12-04

im trying to write a function that returns the length of the longest run of repetition in a given list

Here is my code: `

def longest_repetition(a):
  longest = 0
  j = 0
  run2 = 0
  while j <= len(a)-1:
    for i in a:
      run = a.count(a[j] == i)
      if run == 1:
          run2  = 1
    if run2 > longest:
        longest = run2
    j  = 1
    run2 = 0
  return longest

print(longest_repetition([4,1,2,4,7,9,4]))
print(longest_repetition([5,3,5,6,9,4,4,4,4]))

3
0

`

The first test function works fine, but the second test function is not counting at all and I'm not sure why. Any insight is much appreciated

Edit: Just noticed that the question I was given and the expected results are not consistent. So what I'm basically trying to do is find the most repeated element in a list and the output would be the number of times it is repeated. That said, the output for the second test function should be 4 because the element '4' is repeated four times (elements are not required to be in one run as implied in my original question)

CodePudding user response:

First of all, let's check if you were consistent with your question (function that returns the length of the longest run of repetition): e.g.:

a = [4,1,2,4,7,9,4]

b = [5,3,5,6,9,4,4,4,4]

(assuming, you are only checking single position, e.g. c = [1,2,3,1,2,3] could have one repetition of sequence 1,2,3 - i am assuming that is not your goal)

So:

for a, there is no repetitions of same value, therefore length equals 0

for b, you have one, quadruple repetition of 4, therefore length equals 4

First, your max_amount_of_repetitions=0 and current_repetitions_run=0' So, what you need to do to detect repetition is simply check if value of n-1'th and n'th element is same. If so, you increment current_repetitions_run', else, you reset current_repetitions_run=0. Last step is check if your current run is longest of all:

max_amount_of_repetitions= max(max_amount_of_repetitions, current_repetitions_run)

to surely get both n-1 and n within your list range, I'd simply start iteration from second element. That way, n-1 is first element.

for n in range(1,len(a)):
    if a[n-1] == a[n]:
       print("I am sure, you can figure out the rest")

CodePudding user response:

you can use hash to calculate the frequency of the element and then get the max of frequencies.

using functional approach

from collections import Counter
def longest_repitition(array):
    return max(Counter(array).values())

other way, without using Counter

def longest_repitition(array):
    freq = {}
    for val in array:
        if val not in freq:
            freq[val] = 0
        freq[val]  = 1
    values = freq.values()
    return max(values)
  • Related