Как перебрать словарь Python, упорядоченный по значениям? - PullRequest
22 голосов
/ 23 марта 2009

У меня есть словарь, как:

{ 'a': 6, 'b': 1, 'c': 2 }

Я бы хотел перебрать его по значению , а не по ключу. Другими словами:

(b, 1)
(c, 2)
(a, 6)

Какой самый простой способ?

Ответы [ 4 ]

38 голосов
/ 23 марта 2009
sorted(dictionary.items(), key=lambda x: x[1])

для тех из вас, кто ненавидит лямбду: -)

import operator
sorted(dictionary.items(), key=operator.itemgetter(1))

Однако operator версия требует CPython 2.5 +

8 голосов
/ 23 марта 2009

Для программ, не относящихся к Python 3, вам необходимо использовать итеримы для повышения производительности генераторов, которые выдают значения по одному вместо того, чтобы возвращать их все сразу.

sorted(d.iteritems(), key=lambda x: x[1])

Для еще больших словарей мы можем пойти еще дальше и использовать ключевую функцию в C вместо Python, как сейчас с лямбдой.

import operator
sorted(d.iteritems(), key=operator.itemgetter(1))

Ура!

5 голосов
/ 30 августа 2011

Часто очень удобно использовать namedtuple . Например, у вас есть словарь имен и оценок, и вы хотите отсортировать по «счету»:

import collections
Player = collections.namedtuple('Player', 'score name')
d = {'John':5, 'Alex':10, 'Richard': 7}

сортировка с наименьшим количеством баллов:

worst = sorted(Player(v,k) for (k,v) in d.items())

сортировка с наивысшим результатом:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)

Порядок 'key' и 'value' в перечисленных кортежах (value, key), но теперь вы можете получить имя и счет, скажем, второго лучшего игрока (index = 1), очень похожего на Python это:

    player = best[1]
    player.name
        'Richard'
    player.score
         7
3 голосов
/ 23 марта 2009

Метод items дает вам список (ключ, значение) кортежей, которые можно отсортировать, используя sorted и пользовательский ключ сортировки:

Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 

>>> a={ 'a': 6, 'b': 1, 'c': 2 }
>>> sorted(a.items(), key=lambda (key,value): value)
[('b', 1), ('c', 2), ('a', 6)]

В Python 3 лямбда-выражение должно быть изменено на lambda x: x[1].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...