Top-k On A List Of Dict In Python
Is there an easy way to perform the max k number of key:values pair in this example s1 = {'val' : 0} s2 = {'val': 10} s3 = {'val': 5} s4 = {'val' : 4} s5 = {'val' : 6} s6 = {'val'
Solution 1:
Here's a working example:
s1 = {'val': 0}
s2 = {'val': 10}
s3 = {'val': 5}
s4 = {'val': 4}
s5 = {'val': 6}
s6 = {'val': 7}
s7 = {'val': 3}
shapelets = [s1, s2, s3, s4, s5, s6, s7]
print(sorted(shapelets, key=lambda x: x['val'])[-5:])
Solution 2:
You can use heapq
:
import heapq
s1 = {'val': 0}
s2 = {'val': 10}
s3 = {'val': 5}
s4 = {'val': 4}
s5 = {'val': 6}
s6 = {'val': 7}
s7 = {'val': 3}
shapelets = [s1, s2, s3, s4, s5, s6, s7]
heapq.nlargest(5,[dct['val'] for dct in shapelets])
# [10, 7, 6, 5, 4]
heapq
is likely to be faster than sorted
for large lists
if you only want a few of the largest values. Some discussions of heapq
vs. sorted
are here.
Solution 3:
You could do it in linear time using numpy.argpartition:
from operator import itemgetter
import numpy as np
arr = np.array(list(map(itemgetter("val"), shapelets)))
print(arr[np.argpartition(arr, -5)][-5:])
The 5 max values will not necessarily be in order, if you want that then you would need to sort the k elements returned.
Post a Comment for "Top-k On A List Of Dict In Python"