Home > Software engineering >  Get Indeces of list of numbers Top N, next top N, and last top N
Get Indeces of list of numbers Top N, next top N, and last top N

Time:07-30

Given that I have a list of numbers:

raw_list = [10, 9, 2, 8, 1, 3, 5, 4, 6, 7,11]

I want to separate it to top N's three times. Which means I want to rank them.

# Top 6 rank as 3
# Next Top 4 rank as 2
# Last Top 1 rank as 1

ranked_list = [3, 3, 2, 3, 1, 2, 2, 2, 3, 3, 3]

What I tried:

sorted(range(len(raw_list)), key=lambda i: raw_list[i])[-2:]

But this only gives indeces of the topmost and not the next topmost value of the list.

CodePudding user response:

Use:

lst = [10, 9, 2, 8, 1, 3, 5, 4, 6, 7, 11]
indices = sorted(range(len(lst)), key=lambda i: lst[i], reverse=True)
ranked_list = [0 for _ in range(len(lst))]
for i, j in enumerate(indices):
    if i < 6:
        ranked_list[j] = 3
    elif i < 6   4:
        ranked_list[j] = 2
    else:
        ranked_list[j] = 1

print(ranked_list)

Output

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

CodePudding user response:

Here's a different approach which is significantly faster than the accepted answer (if that's important):

Edited to show performance timings between the original and accepted answer because @funnydman wants proof

from timeit import timeit
L = [10, 9, 2, 8, 1, 3, 5, 4, 6, 7, 11]

def func1(list_):
    slist = sorted(list_)

    result = []

    top6 = set(slist[5:])
    top4 = set(slist[1:5])

    for e in list_:
        if e in top6:
            result.append(3)
        elif e in top4:
            result.append(2)
        else:
            result.append(1)

    return result

def func2(list_):
    indices = sorted(range(len(list_)), key=lambda i: list_[i], reverse=True)
    ranked_list = [0 for _ in range(len(list_))]
    for i, j in enumerate(indices):
        if i < 6:
            ranked_list[j] = 3
        elif i < 6   4:
            ranked_list[j] = 2
        else:
            ranked_list[j] = 1

    return ranked_list

for func in func1, func2:
    print(func.__name__, timeit(lambda: func(L)))

Output:

func1 1.3904414890002954
func2 2.388311982000232

CodePudding user response:

IIUC, this will work for you:

import pandas as pd
list(pd.cut(l, bins=[0, 1, 5, 11], labels=[1, 2, 3])) 

Output:

[3, 3, 2, 3, 1, 2, 2, 2, 3, 3, 3]
  • Related