сортировка значений Python dict с помощью встроенной функции sorted - PullRequest
6 голосов
/ 24 марта 2012

Мне нужно получить отсортированное представление dict, отсортированное в порядке убывания значений (наибольшее значение в dict будет показано первым).

образец:

mydict={u'jon':30,u'den':26,u'rob':42,u'jaime':31}

Мне нужно показать их как

rob=42
jaime=31
jon=30
den=28

Я пробовал это

from operator import itemgetter
sortedvalues=sorted(mydict,key=itemgetter(1))

Когда я распечатываю список, я получаю

[u'jaime', u'den', u'rob', u'jon']

Этот список неупорядочен! Я что-то упускаю из-за использования отсортированного встроенного? или я неправильно использую itemgetter?

Ответы [ 3 ]

11 голосов
/ 24 марта 2012

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

  1. sorted (mydict, ...) пытается перебрать словарь, используя эквивалент iter(mydict), который вызовет mydict.__iter__()
  2. Итерация словаря дает его ключей , в действительности iter(mydict) совпадает с mydict.iterkeys().
  3. Ваши ключи были строками, и поскольку строки индексируются, itemgetter(1) будет работать со строковым значением, получая второй символ в строке.

Код, который у вас был, потерпел бы неудачу с IndexError, если бы любая строка имела длину в 1 символ, вам просто повезло. (или нет, в зависимости от того, как вы на это смотрите, так как получение IndexError раньше заставило бы вас осознать проблему.)

То, что вы хотите сделать, если вам нужны только значения:

sorted(mydict.values(), reverse=True)

А если вы хотите, чтобы ключи также попарно, вы хотите

sorted(mydict.iteritems(), key=itemgetter(1), reverse=True)
5 голосов
/ 24 марта 2012

Они отсортированы по второй букве в имени;итерация по dict дает его ключи.

sorteditems = sorted(mydict.iteritems(), key=itemgetter(1))
3 голосов
/ 24 марта 2012

Итерация по словарю (что и делает функция sorted) даст вам только его ключи:

>>> sorted(mydict)
[u'den', u'jaime', u'jon', u'rob']

Вместо этого вы хотите отсортировать и ключи, и значения - для этого выбудет использовать mydict.items() (или mydict.iteritems(), что более эффективно при больших значениях):

>>> sorted(mydict.items())
[(u'den', 26), (u'jaime', 31), (u'jon', 30), (u'rob', 42)]

Тогда ваш код будет работать так, как ожидалось:

>>> from operator import itemgetter
>>> sorted(mydict.items(), key = itemgetter(1))
[(u'den', 26), (u'jon', 30), (u'jaime', 31), (u'rob', 42)]

Вы также можете захотетьсортировать по ключу dict в качестве вторичного значения сортировки, если несколько ключей имеют одинаковое значение:

>>> mydict={u'a': 1, 'z': 1, 'd': 1}
>>> sorted(mydict.items(), key = itemgetter(1))
[(u'a', 1), ('z', 1), ('d', 1)]
>>> sorted(mydict.items(), key = itemgetter(1, 0))
[(u'a', 1), ('d', 1), ('z', 1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...