2015-05-03 3 views
0

У меня есть словарь, как это:Сортировать только часть словаря в обратном порядке

{dist: [lat, long]} 

расстояние является ключевым и спутниковые данные, на самом деле массив.

Я хочу отсортировать его по убыванию, но только его часть. Пользователь вводит число, определяющее размер вывода списка на экран, и я хочу только отсортировать его в диапазоне от 0 до размера.

Как это сделать в цикле for? у меня есть:

for (n, i) in enumerate(sorted(myDict)): 
     if (n >= option): 
     break 

который будет сортировать в порядке возрастания и ломаются, когда опция = номер входа пользователем. Однако

sorted(myDict, reverse=True) 

сначала сортировал бы все в обратном порядке, затем выполнял цикл for, что не то, что я хочу. Есть ли хороший способ исправить это? Очевидно, что я могу просто создать новый массив, в этом для цикла, и сделать еще один цикл снова и сортировать новый массив в порядке убывания

array = [] 
for (n, i) in enumerate(sorted(myDict)): 
     if (n >= option): 
     break 

     array.append(...) 

for i in sorted(array, reverse=True): 
    print ... 
+0

dicts не имеют квадратных скобок, они используют фигурные скобки и двоеточия {ключ: значение}, то, что вы называете dict, есть на самом деле список – Totem

+0

О, это была ошибка. Извини за это. – PTN

ответ

2

heapq.nlargest является то, что вы ищете.

import heapq 

for key in heapq.nlargest(n, myDict): 
    print key, myDict[key] 

За кулисами heapq.nlargest строит кучу в O (N ) время, где N является размер вашего Dict. Доступ наибольшего элемента (оставшийся) занимает O (LG N) время, так что совокупная стоимость получения п наибольших элементов представляют собой О (п LG N). До тех пор, пока n «достаточно мал», это лучше, чем O (N lg N) Стоимость сортировки всего списка ключей в первую очередь.

Смежные вопросы