2015-12-08 4 views
1

Все,python сортировать словарные статьи по значению, а затем ключ

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

Мой объект (DataSet) выглядит следующим образом ...

dict_items([(0, {'studentName': 'dan', 'Score': 80.0}), (1, {'studentName': 'rob', 'Score': 92.0})]) 

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

entries = sorted([(dataSet[entry]['studentName'], dataSet[entry]['Score']) for entry in dataSet]) 
    for name, score in entries: 
    print(('Student: {} -- Score: {}%'.format(name, score))) 
+0

можно ли увидеть содержимое dataSet? –

+0

Сортировка по счету, а затем имена, вероятно, не будут работать, если вы не будете иметь диапазоны оценок, в которых вы можете сортировать имена. – SirParselot

+0

@AyushShanker отредактирован, чтобы сделать это более очевидным. –

ответ

2
MyDict = {0: {'Score': 80.0, 'studentName': 'dan'}, 
      1: {'Score': 92.0, 'studentName': 'rob'}, 
      2: {'Score': 10.0, 'StudentName': 'xyz'}} 

Это возвращает список пар ключ-значение в dictio ни капли, отсортированный по значению от самого высокого до самого низкого:

sorted(MyDict.items(), key=lambda x: x[1], reverse=True) 

Для словаря отсортированный по ключу, используйте следующую команду:

sorted(MyDict.items(), reverse=True) 

возвращенного список кортежей, поскольку словари сами по себе не могут быть отсортированы ,

Это может быть как напечатано, так и отправлено в дальнейшие вычисления.

0

Если все, что вам нужно, это список ключей упорядоченный по значению Score:

d = {0: {'Score': 80.0, 'studentName': 'dan'}, 
    1: {'Score': 92.0, 'studentName': 'rob'}, 
    2: {'Score': 10.0, 'studentName': 'xyz'}} 

sorted(d, key=lambda k: d[k]['Score']) 

производит

[2, 0, 1] 

В противном случае, вы можете использовать упорядоченный словарь

from collections import OrderedDict 
od = OrderedDict(sorted(d.items(), key=lambda i: i[1]['Score'])) 

, который дает вам

OrderedDict([(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob'})]) 

, что вы можете распечатать красиво

for v in od.values(): 
    print(v['Score'], v['studentName']) 

10.0 xyz 
80.0 dan 
92.0 rob 
+0

будет ли это соответствовать вашим потребностям? – Pynchia

0

предполагается, что ваш объект является list из tuples из dicts (ближайшая интерпретация я могу достичь с помощью данных, приведенных), Это было бы достаточно:

>>> dict_items = [(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob' 
})] 
>>> sorted(dict_items, key=lambda x: x[1]['Score']) 
# [(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob' 
})] 
0

Другой метод ниже, может быть, кому-то нужно:

d = {0: {'Score': 80.0, 'studentName': 'dan'}, 
    1: {'Score': 92.0, 'studentName': 'rob'}, 
    2: {'Score': 10.0, 'StudentName': 'xyz'}} 

sorted(d, cmp = lambda a,b: cmp(d[a]['Score'],d[b]['Score'])) 
0

Я бы просто использовать:

def comp(x,y): 
    if x[1]['Score'] != y[1]['Score']: 
     return 1 if x[1]['Score'] > y[1]['Score'] else -1 
    elif x[1]['studentName'] < y[1]['studentName']: 
     return -1 
    elif x[1]['studentName'] > y[1]['studentName']: 
     return 1 
    else: 
     return 0 

затем

sorted(dict_items, comp) 

Например для

dict_items = [(0, {'Score': 80.0, 'studentName': 'dan'}), 
       (1, {'Score': 92.0, 'studentName': 'rob'}), 
       (2, {'Score': 70.0, 'studentName': 'foo'})] 

это дает:

[(2, {'Score': 70.0, 'studentName': 'foo'}), (0, {'Score': 80.0, 'studentName': 'dan'}), 
(1, {'Score': 92.0, 'studentName': 'rob'})] 

Но остерегайтесь: Ваш вопрос название было около dictionnary пунктов. Ответ согласован с кодом в вопросе, но сортирует только список кортежей. Если у вас действительно есть dict d, вы должны использовать sorted(d.items())