Сортировка dict по значению и возврату dict, а не список кортежей

Возможный дубликат:
Python: Сортировка словаря по значению

d = {"a":4, "b":12, "c":2}

Если я использую sorted() с lambda:

s = sorted(d.items(), key=lambda(k,v):(v,k))

Я получаю список кортежей (ключ, значение) но я хочу еще раз:

{"c":2, "a":4, "b":12}

И сделав dict(the_list_of_tuples), вы вернетесь к квадрату.

Ответ 1

Стандартные объекты dict не сортируются и поэтому не гарантируют и не сохраняют порядок. Это потому, что, поскольку вы обычно используете dict, получив значение для упорядочения ключей, неважно.

Если вы хотите сохранить заказ, вы можете использовать a OrderedDict. Это не сортируется, но помнит порядок, в который элементы добавляются к нему. Таким образом, вы можете создать его с помощью пар значений ключа в отсортированном порядке:

>>> d = {"a":4, "b":12, "c":2}
>>> from collections import OrderedDict
>>> od = OrderedDict(sorted(d.items(), key=lambda(k,v):(v,k)))
>>> od
OrderedDict([('c', 2), ('a', 4), ('b', 12)])

Ответ 2

Это невозможно. Вы можете получить только отсортированное представление dict, как вы получаете.


Edit

Просто сделал некоторые исследования. Похоже, у Python 2.7 есть что-то под названием OrderedDict, которое позволит вам это сделать. Здесь больше информации о нем: http://docs.python.org/library/collections.html?highlight=ordereddict#ordereddict-examples-and-recipes

Ответ 3

Как многие другие отметили, вы не можете, так как python не позволяет вам это делать (кроме как с заказанными dicts). То, что вы могли бы реализовать, так или иначе (python < 2.7)

>>> d = {"a":4, "b":12, "c":2}
>>> z = [(i,d[i]) for i in d]
>>> z.sort(key=lambda x: x[1])
>>> z
[('c', 2), ('a', 4), ('b', 12)]

И так как теперь d сортируется, вы можете выполнить бинарный поиск по нему, чтобы получить то, что хотите (или обычную итерацию, если вы не слишком заботитесь о скорости).