2016-06-04 1 views
2

Учитывая значение defaultdict(dict) с двумя ключами как строками, а их значение равно float, тогда как найти ключи k в соответствии с порядком уменьшения значения из всего значения defaultdict.Из значения defaultdict найдите пару ключей с наивысшими значениями

Я могу написать 2 цикла и тривиально хранить список из 100 пар и заменить список новой записью, если в n^2 раза найдено нечто большее, чем exisitng. Однако, есть ли правильный способ сделать это в 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 
+0

Вы можете разместить свой желаемый результат для данного примера? – MaxU

+0

@MaxU - Пожалуйста, проверьте сейчас –

ответ

2

Всякий раз, когда вы извлекая большие и smallests значения, в heapq.nlargest и 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().