Сортировка содержимого словаря по значению и ключу - PullRequest
4 голосов
/ 16 августа 2011

Сортировка содержимого диктонары по значению уже подробно описана, поэтому его можно получить примерно так:

d={'d':1,'b':2,'c':2,'a':3}
sorted_res_1= sorted(d.items(), key=lambda x: x[1]) 
# or
from operator import itemgetter 
sorted_res_2 = sorted(d.items(), key=itemgetter(1)) 

Мой вопрос: как лучше всего получить следующий вывод:

[('d', 1), ('b', 2), ('c', 2), ('a', 3)] вместо [('d', 1), ('c ', 2), (' b ', 2), (' a ', 3)]

так, чтобы кортежи сортировались по значению, а затем по ключу, если значение было равно.

Во-вторых, возможно ли такое для обратного: [('a', 3), ('b', 2), ('c', 2), ('d', 1)] вместо [('a', 3), ('c', 2 ), ('b', 2), ('d', 1)]?

Ответы [ 3 ]

4 голосов
/ 16 августа 2011

Параметр sorted key может возвращать кортеж. В этом случае первый элемент в кортеже используется для сортировки элементов, а второй - для разрыва связей, а третий - для тех, кто все еще связан, и так далее ...

In [1]: import operator

In [2]: d={'d':1,'b':2,'c':2,'a':3}

In [3]: sorted(d.items(),key=operator.itemgetter(1,0))
Out[3]: [('d', 1), ('b', 2), ('c', 2), ('a', 3)]

operator.itemgetter(1,0) возвращает кортеж, сформированный из второго, а затем первого элемента. То есть, если f=operator.itemgetter(1,0), то f(x) возвращает (x[1],x[0]).

2 голосов
/ 16 августа 2011

Вы просто хотите стандартное сравнение tuple, но в обратном режиме:

>>> sorted(d.items(), key=lambda x: x[::-1])
[('d', 1), ('b', 2), ('c', 2), ('a', 3)]
0 голосов
/ 16 августа 2011

Альтернативный подход, очень близкий к вашему собственному примеру:

sorted(d.items(), key=lambda x: (x[1], x[0]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...