Ответ 1
sorted(dictionary.items(), key=lambda x: x[1])
для этих вас, которые ненавидят лямбда: -)
import operator
sorted(dictionary.items(), key=operator.itemgetter(1))
Однако для версии operator
требуется CPython 2.5 +
У меня есть словарь вроде:
{ 'a': 6, 'b': 1, 'c': 2 }
Я хотел бы перебирать его по значению, а не по ключу. Другими словами:
(b, 1)
(c, 2)
(a, 6)
Какой самый простой способ?
sorted(dictionary.items(), key=lambda x: x[1])
для этих вас, которые ненавидят лямбда: -)
import operator
sorted(dictionary.items(), key=operator.itemgetter(1))
Однако для версии operator
требуется CPython 2.5 +
Для программ, отличных от Python 3, вы захотите использовать iteritems для повышения производительности генераторов, которые дают значения по одному за раз, а не сразу возвращать их все.
sorted(d.iteritems(), key=lambda x: x[1])
Для еще больших словарей мы можем идти дальше и иметь ключевую функцию в C вместо Python, как сейчас лямбда.
import operator
sorted(d.iteritems(), key=operator.itemgetter(1))
Ура!
Часто бывает очень удобно использовать namedtuple. Например, у вас есть словарь с именем и оценкой, и вы хотите сортировать по 'score':
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)
Порядок "ключ" и "значение" в перечисленных кортежах - это (значение, ключ), но теперь вы можете получить имя и оценку, пусть второй игрок (index = 1) очень Pythonically нравится это:
player = best[1]
player.name
'Richard'
player.score
7
Метод 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]
.