- A+

Category：Languages

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] `

Should return:

`run_list = [2, 1, 1, 3, 2, 1] `

My solution:

`freq_list = [] current = x_list[0] 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[1] 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)) `

Result:

`[2, 1, 1, 3, 2, 1] `