2015-01-27 2 views
2

TXT содержало бы что-то вроде этого:Как отсортировать словарь для печати с самого высокого значения до самого низкого для каждого ключа?

Matt Scored: 10 
Jimmy Scored: 3 
James Scored: 9 
Jimmy Scored: 8 
.... 

кода мне удалось собрать (совершенно новый для питона) здесь:

from collections import OrderedDict 
#opens the class file in order to create a dictionary 
dictionary = {} 
#splits the data so the name is the key while the score is the value 
f = open('ClassA.txt', 'r') 
d = {} 
for line in f: 
    firstpart, secondpart = line.strip().split(':') 
    dictionary[firstpart.strip()] = secondpart.strip() 
    columns = line.split(": ") 
    letters = columns[0] 
    numbers = columns[1].strip() 
    if d.get(letters): 
     d[letters].append(numbers) 
    else: 
     d[letters] = list(numbers) 
#sorts the dictionary so it has a alphabetical order 
sorted_dict = OrderedDict(sorted(d.items())) 
print (sorted_dict) 

И проблема, которую я столкнулся, когда пытаюсь напечатать словарь с именами и оценками от наивысшего до самого низкого - это то, что он будет либо печатать имя с наивысшим балл при использовании функции max, либо если im использует itemgetter, он, по-видимому, работает для самых низких до максимумов. Поэтому мне было интересно, сможет ли кто-нибудь помочь мне. Все, что ценится, объясните, если это возможно :)

+0

@agconti: ОП не использует Django. – Kevin

+0

не отредактируйте свой вопрос после ответа! Это вряд ли поможет помощнику следующего ... –

ответ

3

Вы можете использовать это:

sorted_dict = OrderedDict(
    sorted((key, list(sorted(vals, reverse=True))) 
      for key, vals in d.items())) 

Этот фрагмент сортирует имена в алфавитном порядке и оценки для каждого имени от наивысшего до самого низкого. Параметр reverse в методах сортировки может использоваться, чтобы заставить порядок от наивысшего до самого низкого.

Например:

>>> d = {"Matt": [2,1,3], "Rob": [4,5]} 
>>> OrderedDict(sorted((key, list(sorted(vals, reverse=True))) for key, vals in d.items())) 
OrderedDict([('Matt', [3, 2, 1]), ('Rob', [5, 4])]) 
+0

Спасибо, работает как шарм, может, ты скажешь мне, что означает «валс», или я могу просто понять, что бит лучше? –

+0

@PythonPerson 'd.items()' является итерабельностью кортежей с двумя элементами: первый - это ключ, второй - значение. Таким образом, 'для ключа, vals в d.items()' разделяет эти кортежи: ключ переходит в 'key', и значение переходит в' vals' – Kolmar

+0

Спасибо снова мат. –

2

Вы можете использовать OrderedDict:

# regular unsorted dictionary 
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} 

# dictionary sorted by value 
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1])) 
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]) 
+0

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

+2

@PythonPerson - просто передайте 'reverse = True' для' sorted'. Альтернативно, поскольку значения являются числовыми, вы можете использовать 'key = lambda t: -t [1]' (например, отрицать значение), но я думаю, что reverse = True, вероятно, лучше. – mgilson

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

  • Нет связанных вопросов^_^