从 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 有效。
给定一个 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 有效。