Oct-15-2018, 05:51 PM
I have an array in Python and i want to find the two largest values in that array and their corresponding position in that array.
Can anyone please share the approach for it?
Can anyone please share the approach for it?
a = [1,2,3,4,5] high1 = 0 high2 = 0 for item in a: if item > high1: high1 = item pos = a.index(item) print str(high1) print str(pos) for item in a: if item > high2 and item < high1: high2 = item pos = a.index(item) print str(high2) print str(pos)
max_values = sorted(your_array, reverse=True)[:2] indices = [your_array.index(value) for value in max_values]
>>> def n_max(seq, n=2): ... max_items = sorted(enumerate(seq), key=lambda x: x[1])[-1 * n:] ... return max_items[::-1] ... >>> items = [4, 5, 3, 2, 63, 0, 1, 5] >>> n_max(items, 2) [(4, 63), (7, 5)]Here you go, pal. Hopefully this isn't homework, because an instructor wouldn't accept this lol.
enumerate()
to create a list of index-value pairs, which we then sort by value, using the key
argument of sorted()
. Once the list is sorted by value, we simply grab the n
items off the end of the list, since the largest values are at the end, and reverse it before returning it so the largest item is the first in the result set.(Oct-17-2018, 08:03 PM)nilamo Wrote: [ -> ]>>> def n_max(seq, n=2): ... max_items = sorted(enumerate(seq), key=lambda x: x[1])[-1 * n:] ... return max_items[::-1] ... >>> items = [4, 5, 3, 2, 63, 0, 1, 5] >>> n_max(items, 2) [(4, 63), (7, 5)]....
from operator import itemgetter def n_max(seq, n=2): return sorted(enumerate(seq), key=itemgetter(1), reverse=True)[:n]
from operator import itemgetter def n_max(seq, n=2): max_items = sorted(enumerate(seq), key=lambda x: x[1])[-1 * n:] return max_items[::-1] def my_max(seq, n=2): max_values = sorted(seq, reverse=True)[:n] indices = [seq.index(value) for value in max_values] return list(zip(indices, max_values)) def n_max_2(seq, n=2): return sorted(enumerate(seq), key=itemgetter(1), reverse=True)[:n] if __name__ == '__main__': import timeit print(timeit.timeit('n_max(seq)', setup='seq=[x for x in range(10000)]; from __main__ import n_max', number=1000)) print(timeit.timeit('my_max(seq)', setup='seq=[x for x in range(10000)]; from __main__ import my_max', number=1000)) print(timeit.timeit('n_max_2(seq)', setup='seq=[x for x in range(10000)]; from __main__ import n_max_2, itemgetter', number=1000))and the results are:
(Oct-17-2018, 08:56 PM)LeSchakal Wrote: [ -> ]and the results are:
2.84397915685567
0.6598219036493851
2.251084051447339
.index()
, it's slower the more results you want (I believe O(n) is what it'd be called). For example, if you change it to be 1) an unsorted starting list (sorted starting list is cheating kind of), and b) more than just the max(2), you'll see a huge difference. Here's an example (I moved to a global seq
so each has a fair starting point): if __name__ == '__main__': import random, timeit seq = [x for x in range(10000)] random.shuffle(seq) print(timeit.timeit('n_max(seq, 100)', setup='from __main__ import seq, n_max', number=1000)) print(timeit.timeit('my_max(seq, 100)', setup='from __main__ import seq, my_max', number=1000)) print(timeit.timeit('n_max_2(seq, 100)', setup='from __main__ import seq, n_max_2, itemgetter', number=1000))
Output:3.9099400770000003
10.747478319
3.6070847269999984
(Oct-17-2018, 09:17 PM)nilamo Wrote: [ -> ]Ok, but because you use .index(), it's slower the more results you want (I believe O(n) is what it'd be called). For example, if you change it to be 1) an unsorted starting list (sorted starting list is cheating kind of), and b) more than just the max(2), you'll see a huge difference.