Единственные методы я нашел работу для python2, или возвратите только список кортежей.
Действительно ли возможно отсортировать словарь, например. {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
, его значениями?
Порядок отсортированного словаря, которого я хочу достигнуть, от самого большого до самого маленького. Я хочу, чтобы результаты были похожи на это:
bb 4
aa 3
cc 2
dd 1
И после сортировки я хочу сохранить его в текстовый файл.
itemgetter
(см. другие ответы) (как я знаю), более эффективный для больших словарей, но для общего падежа, я верю этому d.get
победы. И это не требует дополнительного import
.
>>> d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
>>> s = [(k, d[k]) for k in sorted(d, key=d.get, reverse=True)]
>>> for k, v in s:
... k, v
...
('bb', 4)
('aa', 3)
('cc', 2)
('dd', 1)
Примечание, которое альтернативно можно установить d.__getitem__
как key
функция, которая может обеспечить маленькое повышение производительности более чем d.get
.
К словарю вида мы могли использовать модуль оператора. Здесь документация модуля оператора.
import operator #Importing operator module
dc = {"aa": 3, "bb": 4, "cc": 2, "dd": 1} #Dictionary to be sorted
dc_sort = sorted(dc.items(),key = operator.itemgetter(1),reverse = True)
print dc_sort
Выходная последовательность будет отсортированным списком:
[('bb', 4), ('aa', 3), ('cc', 2), ('dd', 1)]
, Если мы хотим отсортировать относительно ключей, мы можем использовать
dc_sort = sorted(dc.items(),key = operator.itemgetter(0),reverse = True)
, Выходная последовательность будет:
[('dd', 1), ('cc', 2), ('bb', 4), ('aa', 3)]
Более простое (и на ~10% быстрее) путь должно использовать лямбда-выражение
d = {'aa': 3, 'bb': 4, 'cc': 2, 'dd': 1}
s = sorted(d.items(), key=lambda x: x[1], reverse=True)
for k, v in s:
print(k, v)
Синхронизации
%%timeit
на CPython 3.7 с print(k, v)
замененный pass
для хранения IO от изображения.
Принятый ответ с помощью d.get ():
1.19 µs ± 16.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Лямбда-выражение:
1.07 µs ± 10.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Можно отсортировать по значения в реверс порядок (самый большой к самому маленькому) использование понимание словаря :
{k: d[k] for k in sorted(d, key=d.get, reverse=True)}
# {'b': 4, 'a': 3, 'c': 2, 'd': 1}
, Если Вы хотите отсортировать по [1 110] значения в порядке возрастания (самый маленький к самому большому)
{k: d[k] for k in sorted(d, key=d.get)}
# {'d': 1, 'c': 2, 'a': 3, 'b': 4}
, Если Вы хотите отсортировать по эти ключи в порядке возрастания
{k: d[k] for k in sorted(d)}
# {'a': 3, 'b': 4, 'c': 2, 'd': 1}
, Это работает над CPython 3.6 + и любая реализация Python 3.7 +, потому что словари сохраняют порядок вставки.
from collections import OrderedDict
from operator import itemgetter
d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
print(OrderedDict(sorted(d.items(), key = itemgetter(1), reverse = True)))
печать
OrderedDict([('bb', 4), ('aa', 3), ('cc', 2), ('dd', 1)])
, Хотя от Вашего последнего предложения, кажется, что список кортежей работал бы просто великолепно, например,
from operator import itemgetter
d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
for key, value in sorted(d.items(), key = itemgetter(1), reverse = True):
print(key, value)
, который печатает
bb 4
aa 3
cc 2
dd 1
Чтобы отсортировать словарь и сохранить его функционирующий как словарь впоследствии, Вы могли использовать OrderedDict из стандартной библиотеки.
, Если это не то, в чем Вы нуждаетесь, затем я поощряю Вас пересматривать функции вида, которые оставляют Вас со списком кортежей. То, что производит Вас, хотело, если не заказанный список пар "ключ-значение" (кортежи)?