сортировать dict по значению python [дубликат]

avatar
kingRauk
27 мая 2013 в 11:22
261894
9
91

Предположим, у меня есть диктофон.

data = {1:'b', 2:'a'}

И я хочу отсортировать данные по 'b' и 'a', чтобы получить результат

'a','b'

Как мне это сделать?
Есть идеи?

Источник
Ashwini Chaudhary
27 мая 2013 в 11:23
5

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

gseattle
17 июля 2015 в 03:49
0

А что, если мне нужен список ключей, отсортированный по значению? Таким образом, оригинал вернет [2, 1], это может быть список игроков, отсортированный по их счетам, например, отбрасывая оценки.

AnnieFromTaiwan
23 апреля 2017 в 09:03
0

@gseattle sorted(data.keys(), key=data.get)

Ответы (9)

avatar
Marius
29 сентября 2017 в 20:42
3

Вы можете создать отсортированный список из значений и перестроить словарь:

myDictionary={"two":"2", "one":"1", "five":"5", "1four":"4"}

newDictionary={}

sortedList=sorted(myDictionary.values())

for sortedKey in sortedList:
    for key, value in myDictionary.items():
        if value==sortedKey:
            newDictionary[key]=value

Вывод: newDictionary = {'one': '1', 'two': '2', '1four': '4', 'five': '5'}

avatar
xiyurui
24 мая 2017 в 03:35
2

без лямбда-метода

# sort dictionary by value
d = {'a1': 'fsdfds', 'g5': 'aa3432ff', 'ca':'zz23432'}
def getkeybyvalue(d,i):
    for k, v in d.items():
        if v == i:
            return (k)

sortvaluelist = sorted(d.values())
sortresult ={}
for i1 in sortvaluelist:   
    key = getkeybyvalue(d,i1)
    sortresult[key] = i1
print ('=====sort by value=====')
print (sortresult)
print ('=======================')
avatar
Christian Long
10 ноября 2016 в 19:08
4

В своем комментарии к Джону вы предлагаете ключи и значения словаря, а не только значения.

PEP 256 предлагает это для сортировки словаря по значениям.

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

Если вы хотите упорядочить по убыванию, сделайте это

sorted(d.iteritems(), key=itemgetter(1), reverse=True)
avatar
kingRauk
27 мая 2013 в 13:01
9

Спасибо за все ответы. Вы все мои герои ;-)

Сделал в итоге что-то вроде этого:

d = sorted(data, key = data.get)

for key in d:
    text = data[key]
avatar
njzk2
27 мая 2013 в 12:35
18

Из вашего комментария к ответу gnibbler, я бы сказал, что вам нужен список пар ключ-значение, отсортированный по значению:

sorted(data.items(), key=lambda x:x[1])
avatar
jamylak
27 мая 2013 в 11:53
46

Если вы действительно хотите отсортировать словарь, а не просто получить отсортированный список, используйте collections.OrderedDict

>>> from collections import OrderedDict
>>> from operator import itemgetter
>>> data = {1: 'b', 2: 'a'}
>>> d = OrderedDict(sorted(data.items(), key=itemgetter(1)))
>>> d
OrderedDict([(2, 'a'), (1, 'b')])
>>> d.values()
['a', 'b']
kingRauk
27 мая 2013 в 12:40
0

Печально то, что в Python 2.6.5 ... он не поддерживает OrderedDict

jamylak
27 мая 2013 в 12:41
6

@kingRauk, тогда не помечайте свой вопрос Python 2.7 .... Также многие вещи, которые вы упомянули в комментариях, должны были быть в вашем вопросе с самого начала

kingRauk
27 мая 2013 в 12:53
0

Да, извините за это ...

jamylak
19 мая 2015 в 12:32
0

@kingRauk Никаких проблем, все хорошо

avatar
Morgan Wilde
27 мая 2013 в 11:37
6

Я также думаю, что важно отметить, что тип объекта Python dict представляет собой хеш-таблицу (подробнее об этом здесь), и поэтому его нельзя сортировать без преобразования его ключей / значений в списки. Это позволяет получить dict элемент за постоянное время O(1), независимо от размера / количества элементов в словаре.

Сказав это, после того, как вы отсортируете его ключи - sorted(data.keys()) или значения - sorted(data.values()), вы сможете затем использовать этот список для доступа к ключам / значениям в шаблонах проектирования, таких как эти:

for sortedKey in sorted(dictionary):
    print dictionary[sortedKeY] # gives the values sorted by key

for sortedValue in sorted(dictionary.values()):
    print sortedValue # gives the values sorted by value

Надеюсь, это поможет.

jamylak
27 мая 2013 в 11:50
3

sorted(dictionary) лучше, чем sorted(dictionary.keys())

Morgan Wilde
27 мая 2013 в 12:01
0

@jamylak благодарит за предложение, но мне интересно, будет ли он вести себя по-другому, чем тогда .keys()?

jamylak
27 мая 2013 в 12:04
1

Это семантически эквивалентно, но быстрее и идиоматичнее

avatar
eumiro
27 мая 2013 в 11:23
9

Сортировать значения:

sorted(data.values())

возвращает

['a','b']
avatar
John La Rooy
27 мая 2013 в 11:23
179

Чтобы получить значения, используйте

sorted(data.values())

Чтобы получить совпадающие ключи, используйте функцию key

sorted(data, key=data.get)

Чтобы получить список кортежей, упорядоченных по значению

sorted(data.items(), key=lambda x:x[1])

По теме: см. Обсуждение здесь: Словари упорядочены в Python 3.6+

kingRauk
27 мая 2013 в 12:18
1

Окей, прости. Я имел в виду получить (2: 'a', 1: 'b') ... какие-нибудь идеи?

John La Rooy
27 мая 2013 в 12:54
1

@kingRauk, dict не упорядочены, но вы можете составить упорядоченный список кортежей

mannuscript
5 марта 2018 в 08:33
4

отсортировано (data.items (), key = lambda x: x [1], reverse = True) для повторного порядка