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

Python: соберите этот словарь (dict in dict)

d = { 'a':{'k':1, 'b':'whatever'},  'b':{'k':2, 'b':'sort by k'} }

Хотите отсортировать этот словарь по k как по убыванию, в python.

Немного сложно, пожалуйста, помогите.

4b9b3361

Ответ 1

dict являются неупорядоченными. Таким образом, нет возможности сортировать их напрямую, но если вы желая преобразовать dict в список (key, value) -tuples, тогда вы можете сделать это:

In [9]: d
Out[9]: {'a': {'b': 'whatever', 'k': 1}, 'b': {'b': 'sort by k', 'k': 2}}

In [15]: sorted(d.items(),key=lambda x: x[1]['k'],reverse=True)
Out[15]: [('b', {'b': 'sort by k', 'k': 2}), ('a', {'b': 'whatever', 'k': 1})]

Этот отличный mini-howto объясняет использование параметра key.

Ответ 2

Используйте OrderedDict, если вы используете python 2.7 или новее.

Упорядоченные словари похожи на обычные словари, но они помнят порядок вставки элементов. При повторении по упорядоченному словарю элементы возвращаются в порядке их добавления.

В примере

>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

Чтобы попытаться добиться чего-то такого же эффекта для python 2.4 или ниже, см.

Вставка замены для новых коллекций Py2.7.OrderedDict, который работает в Python 2.4-2.6.

Ответ 3

Словари не сортируются. Это не содержательная концепция. Ключи и значения не являются концептуально ни в каком "порядке", поэтому вы не можете изменить, в каком порядке они находятся.

Ответ 4

Если у вас есть словарь (данные) с суб-словарями (d1 и d2), содержащими значение (v) и приоритет (p), если вы хотите отсортировать словарь для намерения повторить его, тогда вы можете сделайте следующее:

data = { "d1": { "v": "hello", "p": 3}, "d2": {"v": "hi again", "p": 1},}

for item in sorted(data.keys(), key=lambda x: data[x]['p']):
    print item

Ответ 5

from collections import OrderedDict
from operator import *

d = { 'a':{'k':1, 'b':'whatever'},  'b':{'k':2, 'b':'sort by k'} }
sorted_d = OrderedDict(sorted(d.items(), key=lambda x: getitem(x[1], 'k')))