Python: сортировать этот словарь (dict in dict) - PullRequest
12 голосов
/ 02 декабря 2010
d = { 'a':{'k':1, 'b':'whatever'},  'b':{'k':2, 'b':'sort by k'} }

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

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

Ответы [ 5 ]

19 голосов
/ 02 декабря 2010

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

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})]

This превосходное мини-руководство объясняет использование параметра key.

4 голосов
/ 02 декабря 2010

Используйте 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. OrdderedDict, работающий в Python 2.4-2.6.

1 голос
/ 02 декабря 2010

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

0 голосов
/ 11 октября 2017
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')))
0 голосов
/ 21 мая 2015

Если у вас есть словарь (данные) с под-словарями (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...