Обратный порядок вложенного словаря Python - PullRequest
2 голосов
/ 17 февраля 2020

У меня есть двухслойный словарь, и я хотел бы, чтобы простая команда или функция (если это возможно) изменяли порядок словаря, но только внешний слой, а не внутренний. Например, если бы мой словарь был следующим:

{'dictA': {'key_1': 'value_1'}, 'dictB': {'key_2': 'value_2'}, 'dictC': {'key_3', 'value_3'}}

, и я хотел бы вместо этого сделать следующее:

{'dictC': {'key_3', 'value_3'}, 'dictB': {'key_2': 'value_2'}, 'dictA': {'key_1': 'value_1'}}

Как бы я это сделал? Я пробовал такие методы, как invertdict() и inv_map = {v: k for k, v in my_map.items()}, но у меня ничего не получалось.

Любая помощь приветствуется!

Ответы [ 4 ]

4 голосов
/ 17 февраля 2020

Переверните предметы:

>>> dict(reversed(d.items()))
{'dictC': {'value_3', 'key_3'}, 'dictB': {'key_2': 'value_2'}, 'dictA': {'key_1': 'value_1'}}
1 голос
/ 17 февраля 2020

Следующий код поможет:

dict(reversed(current_dct.items()))

0 голосов
/ 17 февраля 2020

Решения, которые реализуют reversed, похоже, не работают в более старых версиях Python, то есть до 3.8. Это решение должно работать в Python 3.x

Код

so_dict = {'dictA': {'key_1': 'value_1'}, 'dictB': {'key_2': 'value_2'}, 'dictC': {'key_3', 'value_3'}}

{k: v for k, v in sorted(list(so_dict.items()), key=lambda x:x[0].lower(), reverse=True)}

Вывод

{'dictC': {'key_3', 'value_3'},
 'dictB': {'key_2': 'value_2'},
 'dictA': {'key_1': 'value_1'}}
0 голосов
/ 17 февраля 2020

Если вы используете Python 3.6 или ниже, словарный порядок не поддерживается или не гарантируется. Что вы можете сделать, это использовать collections.OrderedDict() и применить reversed() для обращения к словарю:

>>> from collections import OrderedDict
>>> d = {'dictA': {'key_1': 'value_1'}, 'dictB': {'key_2': 'value_2'}, 'dictC': {'key_3', 'value_3'}}
>>> OrderedDict(reversed(list(d.items())))
OrderedDict([('dictC', {'value_3', 'key_3'}), ('dictB', {'key_2': 'value_2'}), ('dictA', {'key_1': 'value_1'})])

OrderedDict() является подклассом dict, поэтому он работает как обычный словарь.

Однако, если вы используете более новую версию Python, порядок вставки словаря сохраняется. Таким образом, вы можете просто сделать следующее:

>>> dict(reversed(list(d.items())))
{'dictC': {'value_3', 'key_3'}, 'dictB': {'key_2': 'value_2'}, 'dictA': {'key_1': 'value_1'}}

Примечание: По соображениям безопасности, вероятно, лучше преобразовать list() в d.items, поскольку более старые версии предварительно Python 3.8 не разрешать изменение типа dict_items. В противном случае вы получите ошибку TypeError: 'dict_items' is not reversible.

...