Given a list of data, I'm trying to create a new list in which the value at position
i is the length of the longest run starting from position
i in the original list. For instance, given
x_list = [1, 1, 2, 3, 3, 3]
run_list = [2, 1, 1, 3, 2, 1]
freq_list =  current = x_list count = 0 for num in x_list: if num == current: count += 1 else: freq_list.append((current,count)) current = num count = 1 freq_list.append((current,count)) run_list =  for i in freq_list: z = i while z > 0: run_list.append(z) z -= 1
Firstly I create a list
freq_list of tuples, where every tuple's first element is the element from
x_list, and where the second element is the number of the total run.
In this case:
freq_list = [(1, 2), (2, 1), (3, 3)]
Having this, I create a new list and append appropriate values.
However, I was wondering if there is a shorter way/another way to do this?
Here's a simple solution that iterates over the list backwards and increments a counter each time a number is repeated:
last_num = None result =  for num in reversed(x_list): if num != last_num: # if the number changed, reset the counter to 1 counter = 1 last_num = num else: # if the number is the same, increment the counter counter += 1 result.append(counter) # reverse the result result = list(reversed(result))
[2, 1, 1, 3, 2, 1]