Подтвердить что ты не робот

Словарь python, сортирующий по убыванию в зависимости от значений

Я хочу отсортировать этот словарь d на основе значения sub key key3 в порядке убывания. См. Ниже:

d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 },
      '124': { 'key1': 6, 'key2': 56, 'key3': 6 },
      '125': { 'key1': 7, 'key2': 44, 'key3': 9 },
    }

Таким образом, окончательный словарь будет выглядеть следующим образом.

d = { '125': { 'key1': 7, 'key2': 44, 'key3': 9 },
      '124': { 'key1': 6, 'key2': 56, 'key3': 6 },
      '123': { 'key1': 3, 'key2': 11, 'key3': 3 },
    }

Мой подход заключался в том, чтобы сформировать еще один словарь e из d, ключ которого был бы значением key3, а затем использовать reverse (sorted (e)), но поскольку значение key3 может быть таким же, поэтому словарь e потерял некоторые ключи и их значения. имеет смысл?

Как я могу это сделать? Это не проверенный код. Я просто пытаюсь понять логику.

4b9b3361

Ответ 1

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

В разных терминах ваши d и ваши e будут в точности эквивалентными словарями.

Что вы можете здесь сделать, это использовать OrderedDict:

from collections import OrderedDict
d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 },
      '124': { 'key1': 6, 'key2': 56, 'key3': 6 },
      '125': { 'key1': 7, 'key2': 44, 'key3': 9 },
    }
d_ascending = OrderedDict(sorted(d.items(), key=lambda kv: kv[1]['key3']))
d_descending = OrderedDict(sorted(d.items(), 
                                  key=lambda kv: kv[1]['key3'], reverse=True))

Оригинал d имеет некоторый произвольный порядок. d_ascending имеет порядок, который, по вашему мнению, был у вашего оригинала d, но не сделал этого. И d_ascending имеет порядок, который вы хотите для своего e.


Если вам не нужно использовать e в качестве словаря, вы просто хотите иметь возможность перебирать элементы d в определенном порядке, вы можете упростить это:

for key, value in sorted(d.items(), key=lambda kv: kv[1]['key3'], reverse=True):
    do_something_with(key, value)

Если вы хотите сохранить словарь в отсортированном порядке по любым изменениям, вместо OrderedDict, вы хотите какой-то сортированный словарь. Существует несколько доступных опций, которые можно найти в PyPI, некоторые из которых реализованы поверх деревьев, а другие поверх OrderedDict, которые повторно сортируются по мере необходимости и т.д.

Ответ 2

Краткий пример сортировки словаря - порядок убывания для Python3.

a1 = {'a':1, 'b':13, 'd':4, 'c':2, 'e':30}
a1_sorted_keys = sorted(a1, key=a1.get, reverse=True)
for r in a1_sorted_keys:
    print(r, a1[r])

Следующим будет вывод

e 30
b 13
d 4
c 2
a 1

Ответ 3

вы можете использовать приведенный ниже код для сортировки в порядке убывания и хранения в словаре:

        listname = []  
        for key, value in sorted(dictionaryName.iteritems(), key=lambda (k,v): (v,k),reverse=True):  
            diction= {"value":value, "key":key}  
            listname.append(diction)

Ответ 4

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

import operator

d = {"a":1, "b":2, "c":3}
cd = sorted(d.items(),key=operator.itemgetter(1),reverse=True)

Сортированный словарь будет выглядеть как

cd = {"c":3, "b":2, "a":1}

Здесь operator.itemgetter(1) принимает значение ключа с индексом 1.

Ответ 5

Python dicts по определению не сортируются. Вы не можете сортировать один или управлять порядком своих элементов тем, как вы их вставляете. Возможно, вы захотите посмотреть на коллекции .OrderDict, который даже поставляется с небольшим учебником почти для того, что вы пытаетесь сделать: http://docs.python.org/2/library/collections.html#ordereddict-examples-and-recipes

Ответ 6

Список

dict = {'Neetu':22,'Shiny':21,'Poonam':23}
print sorted(dict.items())
sv = sorted(dict.values())
print sv

Словарь

d = []
l = len(sv)
while l != 0 :
    d.append(sv[l - 1])
    l = l - 1
print d`

Ответ 7

сортировать словарь 'in_dict' по значению в порядке убывания

sorted_dict = {r: in_dict[r] for r in sorted(in_dict, key=in_dict.get, reverse=True)}

пример выше

sorted_d = {r: d[r] for r in sorted(d, key=d.get('key3'), reverse=True)}