从 defaultdict 中,找到具有最高值的键对

From a defaultdict, find the pair of keys with highest values

给定一个 defaultdict(dict),键都是字符串,它们的值都是浮点数,那么我如何根据整个 defaultdict 中值的降序找到 k 个键。

我可以写 2 个循环并简单地存储 100 对的列表,如果在 n^2 次中发现具有超过现有值的内容,则用新条目替换该列表。但是,在 Python.

中是否有正确的方法来执行此操作?

示例文件

defaultdict(<type 'dict'>, {u'just': {u'don': 24.163775416342308, u'like': 28.68171888897304, u'make': 21.69210433035232},'like':{'just':28.68171888897304,'don':12.34, 'mike':27.675}}

期望的输出(假设我只需要整个集合中最有价值的 3 个条目)

just,like, 28.68171
like,mike, 27.675
just,don, 24.16377

无论何时提取最大值和最小值,heapq.nlargest and heapq.nsmallest 函数都是您最好的新朋友:

>>> from heapq import nlargest
>>> from operator import itemgetter
>>> from pprint import pprint

>>> d = defaultdict(dict, 
          {'just': {'don': 24.163775416342308,
                    'like': 28.68171888897304,
                    'make': 21.69210433035232},
           'like': {'don': 12.34,
                    'just': 28.68171888897304,
                    'mike': 27.675}})

>>> flattened = ((outerkey, innerkey, value) for outerkey, innerdict in d.items() 
                 for innerkey, value in innerdict.items())
>>> result = nlargest(3, flattened, key=itemgetter(2))

>>> pprint(result)
[('just', 'like', 28.68171888897304),
 ('like', 'just', 28.68171888897304),
 ('like', 'mike', 27.675)]

在 Python 2 中,使用 iteritems() 而不是 items() 会更 space 有效。