Python 3 сортирует dict по своим значениям

Единственные методы я нашел работу для python2, или возвратите только список кортежей.

Действительно ли возможно отсортировать словарь, например. {"aa": 3, "bb": 4, "cc": 2, "dd": 1}, его значениями?

Порядок отсортированного словаря, которого я хочу достигнуть, от самого большого до самого маленького. Я хочу, чтобы результаты были похожи на это:

bb 4
aa 3
cc 2
dd 1

И после сортировки я хочу сохранить его в текстовый файл.

62
задан 5 December 2018 в 18:49

6 ответов

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.

95
ответ дан 31 October 2019 в 13:37

К словарю вида мы могли использовать модуль оператора. Здесь документация модуля оператора.

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)]
8
ответ дан 31 October 2019 в 13:37

Более простое (и на ~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)
6
ответ дан 31 October 2019 в 13:37

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

{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 +, потому что словари сохраняют порядок вставки.

3
ответ дан 31 October 2019 в 13:37
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
27
ответ дан 31 October 2019 в 13:37

Чтобы отсортировать словарь и сохранить его функционирующий как словарь впоследствии, Вы могли использовать OrderedDict из стандартной библиотеки.

, Если это не то, в чем Вы нуждаетесь, затем я поощряю Вас пересматривать функции вида, которые оставляют Вас со списком кортежей. То, что производит Вас, хотело, если не заказанный список пар "ключ-значение" (кортежи)?

0
ответ дан 31 October 2019 в 13:37

Другие вопросы по тегам:

Похожие вопросы: