#python #sorting #nested #ordereddictionary
#python #сортировка #вложенный #ordereddictionary
Вопрос:
Я пытаюсь отсортировать OrderedDict в OrderedDict по ключу ‘depth’. Есть ли какое-либо решение для сортировки этого словаря?
OrderedDict([
(2, OrderedDict([
('depth', 0),
('height', 51),
('width', 51),
('id', 100)
])),
(1, OrderedDict([
('depth', 2),
('height', 51),
('width', 51),
('id', 55)
])),
(0, OrderedDict([
('depth', 1),
('height', 51),
('width', 51),
('id', 48)
])),
])
Сортированный dict должен выглядеть следующим образом:
OrderedDict([
(2, OrderedDict([
('depth', 0),
('height', 51),
('width', 51),
('id', 100)
])),
(0, OrderedDict([
('depth', 1),
('height', 51),
('width', 51),
('id', 48)
])),
(1, OrderedDict([
('depth', 2),
('height', 51),
('width', 51),
('id', 55)
])),
])
Есть идеи, как это получить?
Ответ №1:
Вам придется создать новый, так как OrderedDict
он отсортирован по порядку вставки.
В вашем случае код будет выглядеть следующим образом:
foo = OrderedDict(sorted(foo.items(), key=lambda x: x[1]['depth']))
Смотрите http://docs.python.org/dev/library/collections.html#ordereddict-examples-and-recipes для получения дополнительных примеров.
Примечание для Python 2 вам нужно будет использовать .iteritems()
вместо .items()
.
Комментарии:
1. Это вызовет исключение, если какой-либо dict не имеет ‘depth’ в качестве ключа. Это может быть желательно. Если это не так, вы можете использовать ключ по умолчанию, используя «get».
2. Обратите внимание, что
[1]
здесь относятся к значениям foo, в отличие от его ключей, которые были бы[0]
Ответ №2:
>>> OrderedDict(sorted(od.items(), key=lambda item: item[1]['depth']))
Ответ №3:
Иногда вы можете захотеть сохранить исходный словарь, а не создавать новый.
В этом случае вы могли бы сделать следующее:
temp = sorted(list(foo.items()), key=lambda x: x[1]['depth'])
foo.clear()
foo.update(temp)
Комментарии:
1. Мне любопытно, можете ли вы привести пример, когда хотелось бы очистить и обновить существующий словарь вместо его повторного назначения?
2. Когда вы обрабатываете dicts, которые могли быть подклассами