在python中的dict列表中的top-k

时间:2016-09-29 13:00:25

标签: python list dictionary

在此示例中是否有一种简单的方法可以执行最大k个键:值对

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]

我想在shapelets列表中获取最多5个数字,因为它知道它包含一个名为“val”的键,并且为其分配了一个值。 这里的解决方案在于解析dict元素列表并获取最大n个数字(在这种情况下是最多5个值)

什么是一个简单的解决方案,python中的运算符库是否支持这样的操作?

3 个答案:

答案 0 :(得分:2)

这是一个有效的例子:

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:])

答案 1 :(得分:1)

您可以使用heapq

heapq
如果您只想要一些最大值,那么

sorted可能比listsheapq更快。关于sorted与{{1}}的一些讨论是here

答案 2 :(得分:1)

您可以使用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:])

5个最大值不一定是有序的,如果你想要那么你需要对返回的k个元素进行排序。