2016-12-17 3 views
2

Редактировать. Я видел ответы на другие вопросы, которые объясняли, как сортировать словари по ключам или значениям, но не видели никакого разрешенного доступа к ключу и значению. Извиняюсь, если я сделал что-то не так, я, очевидно, новый здесь. Кто-то отредактировал спасибо в конце моего сообщения, что кажется странным для меня, но если я не должен делать это в своих сообщениях, было бы здорово, если бы кто-нибудь дал мне знатьСортировка словаря по значениям без потери информации

Я работаю на личном проекте, позволяющем вводить параметры подсчета очков для фэнтезийной лиги бейсбола в программу, а также получать список игроков и общую сумму очков, которые они будут иметь под этой определенной системой подсчета очков. Я проделал некоторую работу с чтением файлов, содержащих итоговые данные из разных категорий подсчета очков и рассчитанных итогов очков, на основе настроек, которые вводит пользователь. Затем я добавляю информацию в словарь, где ключевое имя, команда и позиция игрока являются ключом, а их итогом является значение. Вот первые несколько записей в словаре:

{'Rick Porcello, Bos SP': 579.0, 'Chris Sale, CWS SP': 575.0, 'Justin Verlander, Det SP': 601.0, 'Madison Bumgarner, SF SP': 617.0, 'Max Scherzer, Wsh SP': 668.0, 'Johnny Cueto, SF SP': 584.0} 

Я теперь ищет способ, чтобы отобразить содержимое словаря отсортированные из величайших по крайней мере точка итоги. Например, я хотел бы, чтобы отобразить вышеуказанные записи, как:

'Max Scherzer, Wsh SP': 668.0 
'Madison Bumgarner, SF SP': 617.0 
'Justin Verlander, Det SP': 601.0 
'Johnny Cueto, SF SP': 584.0 
'Rick Porcello, Bos SP': 579.0 
'Chris Sale, CWS SP': 575.0 

Я знаю отсортированного функции для словарей, но оставил меня только список точек итогов. Есть ли способ, по которому я могу сортировать записи на основе значений, но все же иметь доступ к ключам, чтобы я знал, какой игрок набрал X очков?

Кроме того, если есть функция, которая позволяет мне делать то, что я хотел бы, как эта шкала функций? Я бы предположил, что функция даже с плохой сложностью будет в порядке с несколькими записями, но в моем полном словаре будут сотни игроков. Это всего лишь личный проект, поэтому, если мне нужно подождать минутку, чтобы получить результаты, это не имеет большого значения, но, очевидно, быстрее. Мне больше всего любопытно в этой части, так как способность делать это независимо от общей скорости - моя главная проблема.

ответ

2

Если вы хотите сохранить отсортированный результат со структурой ключ/значение рекомендую collections.OrderedDict:

from collections import OrderedDict 
from operator import itemgetter 

dct = {'Rick Porcello, Bos SP': 579.0, 'Chris Sale, CWS SP': 575.0, 'Justin Verlander, Det SP': 601.0, 'Madison Bumgarner, SF SP': 617.0, 'Max Scherzer, Wsh SP': 668.0, 'Johnny Cueto, SF SP': 584.0} 

OrderedDict(sorted(dct.items(), key=itemgetter(1), reverse=True)) 

key=itemgetter(1) определяет, что вам сортировать по «ценности» и reverse=True говорит sorted сортировать в порядке убывания.

Это дает:

OrderedDict([('Max Scherzer, Wsh SP', 668.0), 
      ('Madison Bumgarner, SF SP', 617.0), 
      ('Justin Verlander, Det SP', 601.0), 
      ('Johnny Cueto, SF SP', 584.0), 
      ('Rick Porcello, Bos SP', 579.0), 
      ('Chris Sale, CWS SP', 575.0)]) 

и могут быть доступны как обычный словарь:

>>> odict['Chris Sale, CWS SP'] 
575.0 

или итерацию над ним:

>>> for name, value in odict.items(): 
...  print('{name}: {value}'.format(name=name, value=value)) 
Max Scherzer, Wsh SP: 668.0 
Madison Bumgarner, SF SP: 617.0 
Justin Verlander, Det SP: 601.0 
Johnny Cueto, SF SP: 584.0 
Rick Porcello, Bos SP: 579.0 
Chris Sale, CWS SP: 575.0 

Учитывая, что он сортирует ввод его будет масштабироваться с O(n logn).

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