#python #dictionary #dictionary-comprehension
#python #словарь #понимание словаря
Вопрос:
Я пытаюсь отсортировать вложенный словарь, используя его второй ключ, где мой словарь выглядит как:
my_dictionary = {
"char": {
"3": {
"genman": [
"motion"
]
}
},
"fast": {
"2": {
"empty": []
}
},
"EMPT": {
"0": {}
},
"veh": {
"1": {
"tankers": [
"varA",
"varB"
]
}
}
}
И мой ожидаемый результат будет:
my_dictionary = {
"EMPT": {
"0": {}
},
"veh": {
"1": {
"tankers": [
"varA",
"varB"
]
}
},
"fast": {
"2": {
"empty": []
}
},
"char": {
"3": {
"genman": [
"motion"
]
}
}
}
Пытался использовать следующий код:
new_dict = {}
for k, v in my_dictionary.items():
for s in sorted(my_dictionary.itervalues()):
if not s.keys()[0]:
new_val = my_dictionary[k].get(s.keys()[0])
my_dictionary[s.keys()[0]] = new_val
my_dictionary.update(new_dict)
Это приводит к серьезному сбою, и я получаю тот же результат, что и мой первоначальный словарь.
Комментарии:
1. Попробуйте использовать OrderedDict
Ответ №1:
Это работает:
sorted(my_dictionary.items(), key=lambda x: list(x[1].keys())[0])
ВОЗВРАТ:
[('EMPT', {'0': {}}),
('veh', {'1': {'tankers': ['varA', 'varB']}}),
('fast', {'2': {'empty': []}}),
('char', {'3': {'genman': ['motion']}})]
Sorted получает список пар ключ-значение, мы сортируем, используя результат lambda x: list(x[1].keys())[0]
, который принимает список ключей во внутреннем dict, затем захватывает первый ключ (необходимо сделать это, потому что dict_keys напрямую не индексируется).
Редактировать: результатом является список пар ключ-значение, но его можно передать в OrderedDict, чтобы использовать его как dict.
Ответ №2:
на самом деле для dict нет порядка, однако вместо этого вы можете использовать OrderedDict .
from collections import OrderedDict
my_dictionary = {
"char": {
"3": {
"genman": [
"motion"
]
}
},
"fast": {
"2": {
"empty": []
}
},
"EMPT": {
"0": {}
},
"veh": {
"1": {
"tankers": [
"varA",
"varB"
]
}
}
}
s = sorted((list(v.keys())[0], k) for k, v in my_dictionary.items())
new_dic = OrderedDict([(k,my_dictionary[k]) for _, k in s])
Комментарии:
1. ответ @solarc, я думаю, лучше.