How do I index the 3 highest values in a list?

Question:

so i have these 2 lists:

score = [350, 914, 569, 223, 947, 284, 567, 333, 697, 245, 227, 785, 120, 794, 343, 773, 293, 995]
name = [Ryan, Stacy, Jenna, Peter, Sophie, Bryan, Cole, Andrea, Emily, Blake, Mike, Stephan, Rob, Eliza, Heather, Daniel, Elisabeth, Samantha]

I have to find the 3 highest scores and tally these scores with their respective scorers in the name list, so that I can have new lists

top3score = [947, 995, 914]
top3name = [Sophie, Samantha, Stacy]

I’m thinking of indexing the highest scores, appending them into a list than using the index to tally these scores with the names.

my question is how do i index the 3 highest values in the list?
and then, how do i use the index to look for the scorers name in the name list so that i can append them in the top3name list?

Asked By: rudster

||

Answers:

I think this will do it

sorted(zip(score, name), reverse=True)[:3]

So you understand what is going on:

zip: takes iterables as it’s arguments and takes one element from each iterable, placing them in a tuple.

So:

>>> zip(score, name)
[(350, 'Ryan'), (914, 'Stacy'), (569, 'Jenna'), (223, 'Peter'), (947, 'Sophie'), (284, 'Bryan'), (567, 'Cole'), (333, 'Andrea'), (697, 'Emily'), (245, 'Blake'), (227, 'Mike'), (785, 'Stephan'), (120, 'Rob'), (794, 'Eliza'), (343, 'Heather'), (773, 'Daniel'), (293, 'Elisabeth'), (995, 'Samantha')]

sorted: will sort the data. By default, a tuple element is sorted on the element in the 0 index, so the score in this case. Reverse=True will sort it descending first.

And lastly, the [:3] is slice notation, saying give me all elements from the beginning up to the 3rd element. This could have also been written as [0:3]

Answered By: sberry

If you’re only interested on the top 3, there’sheapq.nlargest:

>>> heapq.nlargest(3, zip(score, name))
[(995, 'Samantha'), (947, 'Sophie'), (914, 'Stacy')]

From the official doc:

heapq.nlargest(n, iterable, key=None)

Return a list with the n largest elements from the dataset defined by iterable. key, if provided, specifies a function of one argument that is used to extract a comparison key from each element in the iterable: key=str.lower Equivalent to: sorted(iterable, key=key, reverse=True)[:n]

Performance notice:

The latter two [nlargest and nsmallest] perform best for smaller values of n. For larger values, it is more efficient to use the sorted() function. Also, when n==1, it is more efficient to use the built-in min() and max() functions.

Answered By: Rik Poggi

In case you want to get the indices instead of the corresponding elements in another list, I made a function to sort the indices by list values.

def sort_index(lst, rev=True):
    index = range(len(lst))
    s = sorted(index, reverse=rev, key=lambda i: lst[i])
    return s

Output

Let’s try sorting the indices of a sample list.

>>> score = [12, 48, 100, 9, 30]
>>> sort_index(score)
[2, 1, 4, 0, 3]

If you want to get the indices of the three largest values, you can just slice the list.

>>> sort_index(score)[:3]
[2, 1, 4]

It also supports sorting from smallest to largest by using the parameter rev=False.

>>> sort_index(score, rev=False)
[3, 0, 4, 1, 2]
Answered By: Troll
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.