2015-11-03 2 views
1

У меня есть innested словарь, напримерheapq nsmallest ключ словаря отсортирован

>>> d={ 
    'out_key': {'aa1':2, 'aa2':3, 'a1':5, 'aa0':2, 'b':1} 
} 

С этого Dict Я хочу первые n ключи с наименьшим значением. Для того, чтобы сделать это, я знаю, что могу использовать heap.nsmallest таким образом:

>>> import heapq 
>>> smallest_2 = heapq.nsmallest(2,d['out_key'],key=d['out_key'].get) 
>>> smallest_2 
['b', 'aa1'] 

Однако в key я хотел бы добавить еще одно условие, а именно иметь ключи отсортирован. Так что smallest_2=['b', 'aa0]. (Примечание smallest_2 не требуется для сортировки.)

Моей первой (неудачной) попытки была установить key=f где

f = lambda x: sorted(x['out_key].get) 

Любое предложение?

ответ

0

В вашей первой (неудачной) попытке вы ошибались, вы должны использовать как значение, так и ключ для аргумента key от heapq.nsmallest(). Пример:

>>> d={ 
...  'out_key': {'aa1':2, 'aa2':3, 'a1':5, 'aa0':2, 'b':1} 
... } 
>>> 
>>> import heapq 
>>> >>> heapq.nsmallest(2,d['out_key'],key=lambda x: (d['out_key'].get(x),x)) 
['b', 'aa0'] 
+0

Правильно, мне не хватало этого важного момента - Спасибо! – rafforaffo

+0

@rafforaffo Рад, что я был полезен! :-). Просто FYI, лучшим способом было бы использовать как значение, так и ключ в аргументе 'key', как обновлено выше (будет быстрее, чем сортировка ключей). –

+0

лучше ли это с точки зрения времени, т. Е. Избегая вычисления 'sorted()' s? – rafforaffo