【问题标题】:Top-k on a list of dict in pythonpython中dict列表上的前k
【发布时间】:2017-02-07 19:47:14
【问题描述】:

在这个例子中,有没有一种简单的方法来执行最大 k 个 key:values 对

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中的算子库是否支持这种操作?

【问题讨论】:

  • 最多 5 个值是指 5 个最大值吗?
  • @Farhan.K 是的,我愿意,我想得到这个列表中的最大值 dict thing

标签: python list dictionary


【解决方案1】:

这是一个工作示例:

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

【讨论】:

    【解决方案2】:

    你可以使用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 可能比 sorted 快对于大 listsheapqsorted 的一些讨论是 here

    【讨论】:

    • 相当肯定 nlargest 是 O(n log k) 所以它应该比调用 sorted 更快。
    【解决方案3】:

    您可以使用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 个元素进行排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 2021-11-20
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多