【问题标题】:Python: sorting the values of a dict and extracting the keys corresponding to the last n valuesPython:对dict的值进行排序并提取与最后n个值对应的键
【发布时间】:2017-03-22 04:12:01
【问题描述】:

假设你有一个这样的字典,但不一定按其值排序:

d={a:2,k:2,c:11,f:17,e:84,y:86}

并且您想将值从最大到最小排序:

order=sorted(d.values(),reverse=True)

这会给你:

order=[86,84,17,11,2,2]

现在,让我们看看最后两个元素:

b=order[-2:]=[2,2]

d 中检索与b 中的值对应的键的Pythonic 方法是什么?在这种情况下,预期的结果是:

ans=[a,k]

【问题讨论】:

  • 永远不会对字典进行排序(关于您的第一句话)
  • 是的,我知道。我已经指定了,因为我的示例是在值中排序的。
  • 你能完整回答这个问题吗?
  • 什么是 Pythonic 方法来检索 d 中与 b 中的值对应的键? 由于相同的值,没有 Pythonic 方法或任何其他方法可以做到这一点可能被许多键“共享”。排序后获取最后两个元素是另一回事..
  • @CF84 我回答是为了告诉你如何使用np.argsort

标签: python sorting dictionary


【解决方案1】:

使用sorted()key 参数获取按值排序的键列表:

>>> d = {'a': 2, 'k': 2, 'c': 11, 'f': 17, 'e': 84, 'y': 86}
>>> sorted(d, key=d.get)[:2]
['a', 'k']

引用文档:

key 指定一个参数的函数,用于提取一个 iterable 中每个元素的比较键(例如, key=str.lower)。默认值为None(比较元素 直接)。

或者,(如果n 很小)您可以使用heapq.nsmallest,这样可以避免对所有键进行排序:

>>> from heapq import nsmallest
>>> nsmallest(2, d, key=d.get)
['a', 'k']

【讨论】:

    【解决方案2】:

    如果您在对dict 进行排序后同时需要键和值,您可以这样做:

    >>> from operator import itemgetter
    >>> order = sorted(d.items(), key=itemgetter(1), reverse=True)
    >>> order[-2:]
    [('a', 2), ('k', 2)]
    

    【讨论】:

      【解决方案3】:

      这是使用np.argsort另一种方法:

      d.values()
      # returns [2, 11, 84, 17, 2, 86]
      
      np.argsort(d.values())
      # array([0, 4, 1, 3, 2, 5]). 
      # Returns the indices that would sort an array.
      
      # Now use it to retrieve the corresponding keys :
      for i in np.argsort(d.values())[:2]:
          print d.keys()[i]
      

      结果

      'a'
      'k'
      

      【讨论】:

        猜你喜欢
        • 2011-03-25
        • 1970-01-01
        • 2018-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-09
        相关资源
        最近更新 更多