Heapq.nlargest index of the returned result in the original sequence

How to return an index to the original list of the n-th largest elements of an iterative

heapq.nlargest(2, [100, 2, 400, 500, 400]) output = [(3,500), (2, 400)] 

It already cost me a couple of hours. I can not understand.

+4
source share
2 answers
 >>> seq = [100, 2, 400, 500, 400] >>> heapq.nlargest(2, enumerate(seq), key=lambda x: x[1]) [(3, 500), (2, 400)] 
+15
source

You can use list.index in combination with map , which runs quickly for small n (beware of list.index returns the index in the list of the first element whose value is x):

 >>> iterable = [100, 2, 400, 500, 400] >>> map(iterable.index, heapq.nlargest(2, iterable)) [3, 2] 

To view related values ​​...

 >>> map(lambda n: (n, iterable.index(n)), heapq.nlargest(2, iterable)) [(500, 3), (400, 2)] 

For large n see @SilentGhost post.


Edit: Defined some solution:

 #!/usr/bin/env python import heapq from timeit import Timer seq = [100, 2, 400, 500, 400] def a(seq): """returns [(3, 500), (2, 400)]""" return heapq.nlargest(2, enumerate(seq), key=lambda x: x[1]) def b(seq): """returns [3, 2]""" return map(seq.index, heapq.nlargest(2, seq)) def c(seq): """returns [(500, 3), (400, 2)]""" map(lambda n: (n, seq.index(n)), heapq.nlargest(2, seq)) if __name__ == '__main__': _a = Timer("a(seq)", "from __main__ import a, seq") _b = Timer("b(seq)", "from __main__ import b, seq") _c = Timer("c(seq)", "from __main__ import c, seq") loops = 1000000 print _a.timeit(number=loops) print _b.timeit(number=loops) print _c.timeit(number=loops) # Core i5, 2.4GHz, Python 2.6, Darwin # 8.92712688446 # 5.64332985878 # 6.50824809074 
+2
source

Source: https://habr.com/ru/post/1314185/


All Articles